1、使用String实现计数
特点:String的Value一般是String,也可以是数字
内部实现:当涉及数字运算时,自动把String转换为Integer进行运算
应用场景:对客户端发送验证码次数进行限制
String借助INCR、INCRBY、DECR、DECRBY可以实现原子计数
2、 使用List实现队列
特点:允许重复
内部实现:List实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销
(1)模拟生产者消费者模式
对于需要高并发写入数据库的场景
可以先将sql语句rpush放入队列,后台线程定期从队列中lpop,再将sql语句进行合并,最后以事务的方式一次执行,大大减轻数据库的压力
(2)事件提醒
Blpop是lpop的阻塞版本,可以模拟【事件触发】场景,当数据到来之前处于阻塞状态,一旦数据到达立即处理,避免使用轮询方式检查数据
(3)消息队列、优先级队列(在高并发环境下,由于来不及同步处理,请求往往会发生堵塞):
使用阻塞方式:blpop high_list mid_list low_list,返回第一个非空List的头部元素
不使用阻塞方式:var listArr = [‘high’,’mid’,’low’],在业务中自主选择遍历哪个List
使用sorted set实现(缺点是没有阻塞版的接口):
Zadd score 230 zhangshan 250 lisi 240 wangwu
由低到高:zrange score 0 -1
由高到低:zrevrange score 0 -1
3、使用Hash存储对象实例
特点:一个key可对应多个field,一个field对应一个value
(1)存储对象
需要存储用户对象信息,key为用户ID,value包含用户姓名、年龄、住址等
Hmset user:001 name zhangshan age 40 city beijing
其它可能的实现
对象序列化
Set user:001 “name:zhangshan,age:40,city:beijing”
Jedis支持set(byte[],byte[])内部实现是序列化
缺点:序列化反序列化开销创建多个key
Set user:001:name zhangshan
Set user:001:age 40
Set user:001:city Beijing
缺点:大量对象会导致大量key如何存储List(Object)
借助序列化发序列化,jedis支持set(byte[],byte[])
(2)消息推送给指定用户
服务端使用hash存储不同用户消息,例如hmset message user01 msg01 user02 msg02 user03 msg03……..
客户端启动时主动拉取消息,根据用户ID去查询自己的消息,例如hget message user01
4、Set
特点:Set不允许重复(自动去重),可以通过SISMEMBER判断是否存在,不同的Set可以求【交集】、【差集】、【并集】
内部实现:Set内部实现是一个 value永远为null的HashMap
5、SortedSet
特点:SortedSet在Set基础上引入SCORE,并可以在SCORE基础上进行一系列统计
内部实现:sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。
应用场景:实现优先级队列、需要排序场景等