赞
踩
redis常用5种数据类型包括:string、hash、list、set、zset。如图:
不常用的3种数据类型有:BitMap(2.2版新加)、Geo(3.2版新加)、HyperLogLog(2.8版新加)。
目录
3、关注模型(包括我关注的人,共同关注、我关注的人也关注她、我可能认识的人)
字符串常用操作:
原子加减操作:
使用SET key value缓存值,使用GET key获取值,使用DEL key删除值即可。
两种方式:缓存对象json值或是把值拆开保存。
可以比较两种方式发现,
第一种json方式我们常用,便于理解,但是修改效率不高。
第二种方式,操作复杂,但是如果需要单独获取或修改某个值效率较高。因为第一种方式需要先json反序列化,修改完成再序列化这些复杂的操作。
同时这种方式只需要取出某一个字段修改保存即可,不需要全部取出来。
执行SETNX product:1 true命令加锁 ///返回1代表获取锁成功,返回0代表失败,前端可以提示“系统繁忙,请稍后再试!”
执行SET product:1 true ex 10 nx //防止死锁,需要加上超时时间
执行完业务操作,执行DEL product:1清除锁(此代码放在try-finall块中)
注意:上面命令在加锁完成之后,设置超时时间之前,如果系统挂掉了依然会导致死锁。
所以需要加锁和设置超时时间合并为一条命令(原子操作),具体需要上网查一下
例如:可以用来记录某文章访问人数
INCR article:readcount:{文章ID} //自增计数,返回自增后的值。如果原来没有值,则返回1
GET article:readcount:{文章ID}
可以使用spring session +redis实现session共享,命令和上面对象缓存一样
INCRBY orderId 1000 //redis批量生成序列化提升性能
优点:
缺点:
拿string中的对象缓存来举例
HMSET user 1:name zhangsan 1:money 1000 //以user为key。id+name为field保存
HMGET user 1:name 1:money //获取
例如:以上是京东购物车页面,可以用redis来实现。(假设用户id是202 商品ID是5005)
首先我们可以以用户的id为hash中的key,商品id为field,商品数量为value。
当我们对购物车进行操作时:
上面的操作一句命令就搞定了,比起mysql,简单高效,还不用担心并发问题。
由于list命令的多样性,所以list可以实现三种数据类型:
LPUSH放数据。RPOP取数据。
提供者:使用LPUSH往队列中放数据
消费者:使用BRPOP往队列中取数据,如果没数据会阻塞。
如果我关注了“备胎说车”公众号,那么它发消息(id:5005)我会收到,这个功能用redis来实现。
1)针对每个用户(id:202)创建一个队列 ,关注的公众号发消息则直接把消息id放入list队列:
LPUSH msg:202 5005(将一个或多个值value插入到key列表的表头)
2)查看最新的消息(前5条):
LRANGE msg:202 0 4 (返回列表key中指定区间内的元素,下标从0开始)
set常用操作:
set运算操作:
抽奖的功能可以用redis的set集合来实现。方法:
1)点击参与抽奖加入集合
SADD choujiang {userId} (往集合choujiang中存入元素)
2)查看参与抽奖的所有用户
SMEMBERS choujiang (获取集合choujiang中所有的元素)
3)抽取1人中奖者
SRANDMEMBER choujiang 1 (从集合choujiang中选出count个元素,元素不从choujiang中删除)
4)抽取等级中奖者(一二三等奖):
例如:微信的点赞功能,使用redis set集合实现。方法:
1)点赞
SADD like:{消息id} {用户id} (往集合中存入元素)
2)取消点赞
SREM like:{消息id} {用户id} (从集合key中删除元素)
3)检查用户是否点过赞
SISMEMBER like:{消息id} {用户id} (判断元素是否存在于集合中)
4)获取点赞的用户列表
SMEMBERS like:{消息id} (获取集合中所有的元素)
5)获取点赞用户数
SCARD like:{消息id} (获取集合中元素的个数)
例如:微博的微关系模块
假设:
我关注的人是:meSet -->{zhangsan,lisi,wangwu}
张三关注的人是:zhangsanSet -->{me,lisi,wangwu,zhaoliu}
李四关注的人是:lisiSet -->{me,zhangsan,zhoaliu,wangwu,zhouqi}
1)我和张三共同关注的人(取交集)
SINTER meSet zhangsanSet -->{lisi,wangwu} (交集运算)
2)我关注的人也关注他(张三)
SISMEMBER lisiSet zhangsan (判断李四关注集合中是否有张三)
SISMEMBER wangwuSet zhangsan (判断王五关注集合中是否有张三)
把我关注的人(除张三外)全部判断一遍即可
3)我可能认识的人(取差集)
SDIFF zhangsanSet meSet -->{me,zhaoliu} (差集运算)
把我关注的人全部取差集判断一遍即可
例如:推荐好文章一类的功能。和上面(我可能认识的人)类似。使用差集取得好友查看过的文章或点赞过的文章
根据时间排序的新闻列表等
通过一个bit位来表示某个元素对应的值或状态
签到:SETBIT signin:2020-01-24 用户id 1 //设置bit位为1
查询是否签到:GETBIT signin:2020-01-24 用户id //如果为1则说明已签到
用户上线:SETBIT loginon:2020-01-24 用户id 1 //设置bit位为1
统计活跃用户:BITCOUNT loginon:2020-01-24 查询所有上过线的用户总数
统计连续5天上线用户:BITOP and continu5day loginon:2020-01-24 loginon:2020-01-25…… (五天的登录记录取交集)
查询在线状态:GETBIT online:2020-01-24 用户id //如果为1则说明在线
是否为会员、是否参加过某次活动、是否已读某篇文章等等……
用于存储地理位置信息,并对信息进行操作。
适合精度不高的场景:找附近的房、找附近的商铺、找附近的人等功能适合Geo。
精度高的场景:打车等功能适合用Google S2。
保存坐标:GEOADD……
获取附近的人:GEORADIUS或GEORADIUSBYMEMBER 命令
进行基数统计用,存在一定误差,但是占用内存非常少。(个人感觉和set集合很类似)
注意:只能统计数量,不能获取元素内容
基数是指在一批数据中不重复的元素有多少。{1,2,3,3,4}-->{1,2,3,4}
接口被请求时,把ip放入:PFADD ip 192.168.1.100
统计访问的人数(ip数):PFCOUNT ip
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。