redis学习(超详细)

redis 全称 Remote Dictionary Server

  • 优质的性能保证
  • 定时异步刷盘
  • 单K-V容量1GB(相比memcache 1MB)
  • 丰富的数据类型(一共支持有8种,常用5种)
    String:最基本的数据类型,二进制安全的字符串,最大512M
    list:按照添加顺序保持顺序的字符串列表
    Hash:key-value对的一种集合
    Set:无序的字符串集合,不存在重复的元素
    SortSet:已排序的字符串集合
    bitmap:更细化的一种操作,以bit为单位
    hyperloglog:基于概率的数据结构
    Geo:地理位置信息储存起来, 并对这些信息进行操作

Redis 应用场景:
服务端购物车、热点数据缓存、分布式全局锁、点赞/打卡/签到、消息队列、用户和关注/商品推荐、分布式全局序列、抽奖、数据存储源、电商产品筛选、计数器、排行榜…

Redis数据类型-String
HashMap
其中String 不是java 中的String,这里的String可以是

  • 字符串(String)
  • 数值(Number)
  • 二进制(bit)

SET - - 存 入一个字符串键
SETNX - - 存入一个字符串键,若key存在操作失败
GET - -获取指定key的字符串
MSET - - 批量存入字符串键
MGET - - 批量获取指定key的字符串
DEL - - 删除指定key

分布式全局锁

redis学习(超详细)_第1张图片
上图是有弊端的,如果程序A拿到了锁,电脑突然断电,程序中断的时候,在Redis 中锁是没有释放的,导致死锁。这种情况应该使用过期键的功能,expire 设置失效时间。时间根据所需的业务设置。

分布式全局锁-伪代码
redis学习(超详细)_第2张图片
这段代码也是有弊端的,第三行和第四行代码是没有事务保障的,保障不了原子性,有可能发生调用del 方法。可以从Redis 方面解决,的运用Lua脚本组装在一起,可以保证原子性的。还可以通过SET的命令加一些可选的参数完成的。

缓存设计
我们使用Redis一般有两种做法:

  • 存入结构化(序列化)数据
  • 合理的key设计配合批处理API

如下图表所示:
redis学习(超详细)_第3张图片
可以通过下列方式处理:

redis学习(超详细)_第4张图片这种方式修改数据还是比较方便的。

Redis数据类型-String(Number)
INCRBY key increment - -对key进行数值相加

set numbertest 1 //1
incrby numbertest 100 //101 

DECRBY key decrement - - 对key进行数值相减
INCR key - - 对key的自加一
DECR key - - 对key的自减一

应用场景:

  • 计数器:
    redis学习(超详细)_第5张图片
  • 全局序列
    redis学习(超详细)_第6张图片
    在分布式中一个表可能有多个节点的,这种可以使用Redis自增加。
    这方式有缺点,增加了与Redis 的频繁IO请求。很少用这种方式。
    多种情况下应用以下方式。
    redis学习(超详细)_第7张图片
    在真正的实现过程中,在Redis中一次性取一段, 这里取的是1000个数,返回本地的内存中,为了下次用的时候直接从内存自增就行了,这样就减缓了跟Redis的访问。

Redis数据类型-String(bit)
redis学习(超详细)_第8张图片
GETBIT key offset - -获取key下标offset的值
SETBIT key offset value - -对key下标offset进行设值
BITCOUNT key[start][end] - - 统计start到end位置设值为1的数量
BITOPS op destkey[key…] - - 对多个key进行位计算【op(AND/OR/XOR/NOT)】

也是支持二进制的,可以存储图片、经常访问的网页。

应用:在线用户统计
redis学习(超详细)_第9张图片
这种方式的使用非常的节省空间,一个bit位就能标识一个用户,1KB大小能存储1B=8bit ,1024×8,可以存8192个,1G大概可以存储80亿个。

Redis数据类型-Hash散列键
HashMap>

redis学习(超详细)_第10张图片
如果把String的结构,看成是K-V 的结构,Hash则是key-field-value的结构。

HSET - - 存入一个key filed散列结构
HSETNX - -存入一个key field,若key中field存在操作失败
HGET - - 获取指定key field
HMSET - - 批量存入key field
HMGET - - 批量获取指定key filed
HDEL - -删除指定key filed
HINCRBY - -对key filed 的数值进行加减操作

hset 和json区别,json是需要序列化和反序列化的,并没有完全提供在Redis层面field字段的相关操作。

缓存设计散列存储redis学习(超详细)_第11张图片
与String类型相比,一个是三层结构一个是两层结构,针对Redis最近最少lru缓存淘汰策略,定时扫描,和对最外层key的管理是不涉及到field层的,用散列键操作的话,key是只有一个的,用key进行ttl的管理。使用散列的意义在于这样使用散列存储,可以将信息凝聚在一起,便于管理。从一定程度上可以避免误操作,减少key的冲突,减少内存/IO/CPU的消耗。散列键不能完全替代String的,分布式锁用散列键就是不能实现的,因为在field层是没有过期键功能的,只有key层是有过期键功能的,在hash结构中,二进制操作是不能原生使用的。当考量数据的分布时,是不能用到散列键的。

应用:购物车实现
redis学习(超详细)_第12张图片

添加:HINCRBY{userID}:shoppingCart{goodsID}{count}
查询:HGET{userID}:shoppingCart

Redis数据类型-Hash散列键
HashMapObject>>
redis学习(超详细)_第13张图片
List是一个有序的列表,可以通过下标来访问的,teachers是key,后面是value.
如果想全部取出来,可以取0到-1。

LPUSH key value[value…] - -往key的列表键中左边放入一个元素,key不存在则新建
RPUSH key value[value…]- - 往key的列表键中右边放入一个元素,key不存在则新建
LPOP key - - 从key的列表键最左端弹出一个元素
RPOP key - - 从key的列表键最右端弹出一个元素
LRANGE key start stop - - 获取列表键从start下标到stop下标的元素
BLPOP key[key…]timeout - -阻塞的从key的列表键最左端弹出一个元素,若列表键中不存在元素,阻塞等待(timeout)秒,若(timeout)=0,一直阻塞
BLPOP key[key…]timeout - -阻塞的从key的列表键最右端弹出一个元素,若列表键中不存在元素,阻塞等待{timeout}秒,若{timeout}=0,一直阻塞( block阻塞)

应用:消息队列
redis学习(超详细)_第14张图片
这是一个典型的生产者与消费者模式,生产者可以不断的生产。

应用:关注的最新消息列表
redis学习(超详细)_第15张图片
redis学习(超详细)_第16张图片

消息保存 LPUSH{andy}:subscribe{msgID}
最新消息列表获取LRANGE{andy}:subscribe 0 10 分页

Redis数据类型-Set
HashMap
HashSet作用:去重、无序redis学习(超详细)_第17张图片
SADD key member[member…] - -往集合键key中存放元素,若key不存在则新建
SREM key member[member…] - -往集合键key中删除元素
SMEMBERS key - -获取集合键key中所有的元素
SCARD key - -获取集合键key的元素个数
SISMEMBER key member - -判断{member}元素是否存在于集合键key中
SPOP key {count} - -从集合键中选出{count}元素,并且从集合键key删除

应用:刷礼物/转发参与抽奖

redis学习(超详细)_第18张图片

  • 刷礼物、转发微博加入到抽奖的集合键中SADD抽奖key{userID}
  • SMEMBERS抽奖key 获取所有用户,滚动列表转起来
  • SPOP抽奖key[count]/SRANDMEMBER抽奖key[count]抽取count名中奖者

应用:点赞、打卡、签到
redis学习(超详细)_第19张图片
Redis 数据类型-Set的运算
交集运算:SINTER key[key…]、SINTERSTORE destination key [key…]
并集运算:SUNION key[key…]、SUNIONSTORE destination key[key…]
差集运算:SDIFF key[key…]、SDIFFSTORE destination key[key…]

应用:用户关注/商品推荐 模型
redis学习(超详细)_第20张图片

应用:商品筛选
redis学习(超详细)_第21张图片

Redis数据类型-Zet(也叫做Sort Set)

redis学习(超详细)_第22张图片
salesV 销售额 storeID某个门店ID date

ZADD key score element[…] - -往有序集合键Key中存在元素,若key不存在则新建。
ZREM key element[element…] - -从有序集合key中删除元素
ZSCORE key element - -获取有序集合key中{element}元素进行score值操作
ZINCRBY key increment element - -给有序集合key中{element}元素进行score值操作,若key不存在则新建,{element}元素不存在则新建后进行score值操作。
ZCARD key - -获取有序集合key中元素个数
ZREVRANGE key start stop[WITHSCORES] - -正序获取有序集合key从start下标到stop下标的元素。
ZREVRANGE key start stop[WITHSCORES] - -倒序获取有序集合key从start下标到stop下标的元素。
集合运算操作
ZUNIONSTORE destkey numkeys key[key…] - -并集计算
ZINTERSTORE destkey numkeys key[key…] - -交集计算
redis学习(超详细)_第23张图片
以上为并集计算,店101 在8月1号和8月2号全部的销售额

应用 :单日排行榜
redis学习(超详细)_第24张图片
485万就是score分值,链接的就是新闻ID。

新闻被点击:ZINCRBY hotnews:{date} 1 {newID}
获取排名前15:ZREVRANGE hotnews:{date} 0 15 WITHSCORES

在使用周榜、月榜、年榜可以用以下结构:
redis学习(超详细)_第25张图片

你可能感兴趣的:(redis,数据库)