redis初学 — redis数据类型(type)应用场景
redis主要有以下5种数据类型:
通过百度归类他们的应用场景有:
1,String
a,json字符串
json字符串可以转化为map、list、自定义java对象等;
适用于存储有时效性的用户登录信息、支付宝支付二维码信息、付费接口但不频繁更新的报文信息(如工商、税务等接口);
b,计数
incr、decr相关的递增、递减命令对于redis(单线程)是安全的原子性操作,最终总能得到正确的计数值;
而get/set无法得到正确的值,可能是因为,比如浏览器上有一篇文章,张三在他的电脑上点赞了,请求来到了后台服务器A,同时李四也在他的电脑上点赞了,请求也来到了后台服务器A,如果后台服务器A使用多线程(一般也如此)线程1和线程2处理了这两个人的请求,线程1去redis请求get原点赞数是66,同时线程2也去redis请求get原点赞数也是66,线程1处理好后去redis请求set点赞数为(+1)67,线程2处理好后也去redis请求set点赞数为(+1)67,不管线程1线程2谁先谁后,最终的点赞数是67,而不是期望的正确值68。而incr不会出现这个问题,是因为线程1、线程2都去redis请求原点赞数+1,因为redis是单线程的,比如先处理线程1的请求,那么点赞数变成67,再处理线程2的请求,点赞数变成68,即得到了期望的正确值68。他们之间的区别是因为线程1、线程2把获得原点赞数这个步骤交给了redis去处理,而不是自己去获得原点赞数;redis是单线程的,操作都是原子性的,包括get/set。
适用于微博数、评论数、点赞数、粉丝数等需要计数的场景;
c,分布式锁
执行setnx key value命令,如果key原先不存在,则返回1(设置成功);key已存在返回0(设置失败);
分布式的多个服务器请求同一个资源,先执行该命令竞争“锁”,返回1的服务器即获得锁,可以使用该资源,并在最后释放(删除)该key(锁);
2,Hash
购物车:
3,List
最新新闻消息
4,Set
a,标签
斗鱼主播标签、qq账号好友给的评价标签;
b,共同爱好、二度好友
多个集合可以方便地获得交集;
c,统计访问ip
5,Zset
各种排行榜单