Redis是一种开源的内存数据库,具有高性能和高可用性,已被广泛应用在缓存、消息队列、聊天室等场景中。在分布式应用运行时,很多情况下会出现多线程并发访问缓存,比如说话 服务器 时,多线程可以同时读取用户资料、查找连接状态、修改缓存中的数据等,为了安全健壮的保证用户的数据完整性,就需要确保Redis的线程安全。
Redis客户端可以基于“写锁”来实现线程安全,通常采用watch/multi/exec机制。当一个客户端执行watch(key)时,它将监控key的更新并且等待multi!exec指令出现。如果表中发生更新,watch命令将放弃对引用的更新并抛出一个错误。例如一段使用“写锁”机制对Redis变量递增进行操作的代码:
client.watch(“num”);
long newNum = client.incr(“num”);
client.multi();
client.set(“num”, newNum);
client.exec();
这样,当多个线程同时执行incr命令来获取num值,无论是否成功,都会执行watch命令,watch命令保证在变量被多客户端更改时,可以保证原子性,也就是让num值保持完整性,使多线程对Redis资源进行安全访问。
此外,Redis提供的“读锁”机制也可以保证Redis的线程安全,这种机制使用锁结构把读取操作绑定在一起,可以有效阻止写入和删除并发访问,使得用户数据不会被干扰。例如以下代码段:
client.lock(“num”);
long newNum = client.incr(“num”);
client.unlock(“num”);
新增的num只有在client.unlock通过后,才能加入数据库,从而可以安全的让多线程的用户同时访问Redis中的数据。

Redis可以通过引入“写锁”和“读锁”机制,来保证多线程访问和操作Redis的安全。使用这样的机制,可以有效的避免多线程并发执行时的数据混乱,为客户端提供可靠的子访问服务。
香港服务器首选树叶云,2H2G首月10元开通。树叶云(www.IDC.Net)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
ArrayList和Vector的数据增长?
首先,楼上说的对(Vector自动增长原来一倍也就是100%,ArrayList是原来的50%),我就不重复了。vector是线程安全的,而arraylist不是线程安全的,其实用法倒没什么特别大的区别,如果是要用在对线程安全不高的环境下还是尽可能用arraylist或linkedlist比较好,性能稍高,如果要用在线程要求很高的环境下还是用vector比较好,不过性能稍差
Java集合类List/Set/Map的区别和联系
常用的集合类有一下几种: List结构的集合类:ArrayList类,LinkedList类,Vector类,Stack类 Map结构的集合类:HashMap类,Hashtable类 Set结构的集合类:HashSet类,TreeSet类 Queue结构的集合:Queue接口 HashMap和Hashtable的区别: HashMap和Hashtable都是java的集合类,都可以用来e68a84e8a2ade799bee5baa6562存放java对象,这是他们的相同点 以下是他们的区别: 1.历史原因: Hashtable是基于陈旧的Dictionary类的,HashMap是java 1.2引进的Map接口的一个现实。 2.同步性: Hashtable是同步的,这个类中的一些方法保证了Hashtable中的对象是线程安全的,而HashMap则是异步的,因此HashMap中的对象并不是线程安全的,因为同步的要求会影响执行的效率,所以如果你不需要线程安全的结合那么使用HashMap是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销,从而提高效率,我们一般所编写的程序都是异步的,但如果是服务器端的代码除外。 3.值: HashMap可以让你将空值作为一个表的条目的key或value Hashtable是不能放入空值(null)的 ArrayList和Vector的区别: ArrayList与Vector都是java的集合类,都是用来存放java对象
Map接口,HashMap和HashTable的相同点和不同点分别是什么?
Hashtable和HashMap的区别是Dictionary的子类,HashMap是Map接口的一个实现类;中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。 即是说,在多线程应用程序中,不用专门的操作就安全地可以使用Hashtable了;而对于HashMap,则需要额外的同步机制。 但HashMap的同步问题可通过Collections的一个静态方法得到解决:Map (Map m)这个方法返回一个同步的Map,这个Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。 3.在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。 当get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对应的值为null。 因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。 Map├Hashtable├HashMap└WeakHashMapMap接口请注意,Map没有继承Collection接口,Map提供key到value的映射。 一个Map中不能包含相同的key,每个key只能映射一个value。 Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。 Hashtable类Hashtable继承Map接口,实现一个key-value映射的哈希表。 任何非空(non-null)的对象都可作为key或者value。 添加数据使用put(key, value),取出数据使用get(key),这两个基本操作的时间开销为常数。 Hashtable通过initial capacity和load factor两个参数调整性能。 通常缺省的load factor0.75较好地实现了时间和空间的均衡。 增大load factor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。 使用Hashtable的简单示例如下,将1,2,3放到Hashtable中,他们的key分别是”one”,”two”,”three”:Hashtable numbers = new Hashtable();(“one”, new Integer(1));(“two”, new Integer(2));(“three”, new Integer(3));要取出一个数,比如2,用相应的key:Integer n = (Integer)(“two”);(“two = ” + n);由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode和equals方法。 hashCode和equals方法继承自根类Object,如果你用自定义的类当作key的话,要相当小心,按照散列函数的定义,如果两个对象相同,即(obj2)=true,则它们的hashCode必须相同,但如果两个对象不同,则它们的hashCode不一定不同,如果两个不同对象的hashCode相同,这种现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希表的操作。 如果相同的对象有不同的hashCode,对哈希表的操作会出现意想不到的结果(期待的get方法返回null),要避免这种问题,只需要牢记一条:要同时复写equals方法和hashCode方法,而不要只写其中一个。 Hashtable是同步的。 HashMap类HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和nullkey。 ,但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap的容量成比例。 因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。 WeakHashMap类WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。
发表评论