Redis常见使用场景

来源:互联网 发布:代言宝无水印版源码 编辑:程序博客网 时间:2024/05/22 17:14

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,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。
应用场景:实现优先级队列、需要排序场景等

原创粉丝点击