Redis常用数据以及高级用法

176 阅读10分钟

简介

redis是当下特别流行的缓存数据库,与Mysql不同的是,Mysql是操作磁盘的,而它是操作内存的,所以它比Mysql快几个数量级。它是以Key-Value(就是数据字典)来存储数据的,它底层使用了多路复用,所以它的性能很高,我们经常说的NoSql数据库也是指它(当然,NoSql指的很宽,不仅仅是它,还有很多其他数据库)

1.png

Redis安装

下载地址:http://redis.io/download
安装步骤: 
# 安装gcc yum install gcc
# 把下载好的redis-5.0.3.tar.gz放在/usr/local文件夹下,并解压 wget http://download.redis.io/releases/redis-5.0.3.tar.gz tar -zxvf redis-5.0.3.tar.gz cd redis-5.0.3 
# 进入到解压好的redis-5.0.3目录下,进行编译与安装 make
# 修改配置 daemonize yes 
#后台启动 protected-mode no
#关闭保护模式,开启的话,只有本机才可以访问redis
# 需要注释掉bind #bind 127.0.0.1(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户端通过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可) 
# 启动服务 src/redis-server redis.conf # 验证启动是否成功 ps -ef | grep redis 
# 进入redis客户端 src/redis-cli
# 退出客户端 quit 
# 退出redis服务: (1)pkill redis-server (2)kill 进程号 (3)src/redis-cli shutdown

Redis几种常见得数据结构有:

  • String(字符串数据结构,经常使用,例如:"Hello World")
  • Hash(哈希数据结构,键值对,和Map类似,例如:"{key,value}")
  • List(列表List数据结构,和数组类似,例如:"[1,2,3,4]")
  • Set(集合Set数据结构,例如"[a,b,c]")
  • Zset(有序集合,是一个按照大小顺序排列的集合,例如"[a:1,b:2,c:3]")

Key.png

String常见的应用场景:

字符串常见操作:

SET  key  value 			//存入字符串键值对
MSET  key  value [key value ...] 	//批量存储字符串键值对
SETNX  key  value 		//存入一个不存在的字符串键值对
GET  key 			//获取一个字符串键值
MGET  key  [key ...]	 	//批量获取字符串键值
DEL  key  [key ...] 		//删除一个键
EXPIRE  key  seconds 		//设置一个键的过期时间(秒)

原子加减

INCR  key 			//将key中储存的数字值加1
DECR  key 			//将key中储存的数字值减1
INCRBY  key  increment 		//将key所储存的值加上increment
DECRBY  key  decrement 	//将key所储存的值减去decrement

字符创常见的应用场景

  • 单值缓存(set key value,get key)
  • 对象缓存(set key JSON(序列化的对象字符传),hset key1 value1 key2 value2,hget key1 key2)
  • 分布式锁(setnx key true)
  • 计数器(incr key 文章浏览量自增)
  • WebSession共享(spring session + redis实现session共享)
  • 分布式系统全局序列号(IncrBy Key)

Hash的常见应用场景

Hash的常见操作

HSET  key  field  value 			//存储一个哈希表key的键值
HSETNX  key  field  value 		//存储一个不存在的哈希表key的键值
HMSET  key  field  value [field value ...] 	//在一个哈希表key中存储多个键值对
HGET  key  field 				//获取哈希表key对应的field键值
HMGET  key  field  [field ...] 		//批量获取哈希表key中多个field键值
HDEL  key  field  [field ...] 		//删除哈希表key中的field键值
HLEN  key				//返回哈希表key中field的数量
HGETALL  key				//返回哈希表key中所有的键值

HINCRBY  key  field  increment 		//为哈希表key中field键的值加上增量increment

Hash常见的应用场景

  • 对象缓存(HMset user {userId}:username zhansan {userId}:age 18 ...)
  • 添加购物车(HSet cart:userId productId productNum),要是同一个商品买两个可以用hincrby cart:HSet cart:userId productId needProductNum(需要添加的商品个数)

List常见的应用场景

List常用的操作

LPUSH  key  value [value ...] 		//将一个或多个值value插入到key列表的表头(最左边)
RPUSH  key  value [value ...]	 	//将一个或多个值value插入到key列表的表尾(最右边)
LPOP  key			//移除并返回key列表的头元素
RPOP  key			//移除并返回key列表的尾元素
LRANGE  key  start  stop		//返回列表key中指定区间内的元素,区间以偏移量start和stop指定

BLPOP  key  [key ...]  timeout	//从key列表表头弹出一个元素,若列表中没有元素,阻塞等待					timeout秒,如果timeout=0,一直阻塞等待
BRPOP  key  [key ...]  timeout 	//从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待					timeout秒,如果timeout=0,一直阻塞等待

List常见的应用场景

  • 构建栈数据结构,用RPush指令向List列表的右边的中添加一个或者多个元素,用Rpop指令从List列表的右则取元素,列表的右边进右边取先进列表后面出来。

未命名文件-导出.png

  • 构建消息队列,用LPush指令向List列表的左边的中添加一个或者多个元素,用Rpop指令从List列表的右边则取元素,列表的左边边进右边取先进列表先出来。

未命名文件-导出 (1).png

  • 构建阻塞队列用LPush指令向List列表的左边的中添加一个或者多个元素,用BRPOP指令从列表中取元素,没有就阻塞等待,有就从列表的右边取元素,列表的左边进右边取先进列表先出来,实现了一个阻塞队列。

未命名文件-导出 (3).png

  • 消息流的推送,像微博,必然要你关注了某个人这个人发朋友圈的时候消息就会推送给你。这种就是数据流的推送,有两种模式,推和拉模式

    • 被关注的这个人粉丝少的情况下用推模式,推模式就是被关注的那个人发消息同时把这个消息用RPUSH指令缓存到关注那个人的List列表中,然后BRPOP取数据,关注的那个人维护一个被关注人的List消息列表,被关注得人发送消息的时候就将被关注人的消息缓存到这个列表中,被关注得这个人有所少个粉丝就得维护多少个List列表,不适用于粉丝特别多的场景

    未命名文件-导出 (8).png

    • 被关注的这个人粉丝量特别大就用拉模式,拉模式就是被关注的人发送消息将消息用RPOP指令缓存到被关注人的消息列表中,然后用BRPOP指令从被关注人的列表中取数据。被关注的那个人维护一个List消息列表,被关注的人发送消息就将消息缓存到被关注人的这个消息列表中,它的粉丝从这个列表中拉取数据。

未命名文件-导出 (6).png

Set的常见使用场景

Set的常见操作

Set常用操作
SADD  key  member  [member ...]			//往集合key中存入元素,元素存在则忽略,
							若key不存在则新建
SREM  key  member  [member ...]			//从集合key中删除元素
SMEMBERS  key					//获取集合key中所有元素
SCARD  key					//获取集合key的元素个数
SISMEMBER  key  member			//判断member元素是否存在于集合key中
SRANDMEMBER  key  [count]			//从集合key中选出count个元素,元素不从key中删除
SPOP  key  [count]				//从集合key中选出count个元素,元素从key中删除

Set运算操作
SINTER  key  [key ...] 				//交集运算
SINTERSTORE  destination  key  [key ..]		//将交集结果存入新集合destination中
SUNION  key  [key ..] 				//并集运算
SUNIONSTORE  destination  key  [key ...]		//将并集结果存入新集合destination中
SDIFF  key  [key ...] 				//差集运算
SDIFFSTORE  destination  key  [key ...]		//将差集结果存入新集合destination中

Set的常见应用场景

  • 抽奖活动

    • SADD Key 点赞的userid
    • SMEMBERS key 查看抽奖人数
    • SRANDMEMBER key [count](中奖的人数)抽奖指令
  • 微信朋友圈点赞列表的获取和我是否点赞

    • 点赞: SADD like:{消息ID} {用户ID}
    • 取消点赞: SREM like:{消息ID} {用户ID}
    • 检查用户是否点过赞: SISMEMBER like:{消息ID} {用户ID}
    • 获取点赞的用户列表: SMEMBERS like:{消息ID}
    • 获取点赞用户数:SCARD like:{消息ID}
  • 社交类应用app的好友关系模型

    • 集合的计算:交集(两个集合共同拥有的元素去重,例如a集合有元素{a,b,c,d},b集合有元素{c,d,e,f},那么他们的交集就是{c,d}),并集(两个元素合并去重,例如a集合有元素{a,b,c,d},b集合有元素{c,d,e,f},那么他们的并集就是{a,b,c,d,e,f}),差集(例如a集合{a,b,c},b集合{b,c,e},以a集合为准,去掉a集合中在b中也存在的元素,所以a集合和b集合的差集就是{a})

    • 好友模型之我可能认识的人/我感兴趣的人,有可能认识、感兴趣的人顾名思义就是可能认识也可能不认识,就是我关注的人所关注的集合中我没有关注的,就是将我所关注人的列表我我关注的列表取差集;例如张三关注了李四和王五,李四也关注王五和赵六,赵六就是我有可能认识的人,将李四的关注列表和张三的关注列表取差集。得到的就是我有可能认识的人、感兴趣的人列表

    • 好友模型之共同关注,例如张三关注的集合是{a,b,c},李四关注的集合是{b,c,d, e},共同关注顾名思义就是张三和李四都有关注的就是取张三和李四关注集合的交集

    • 好友模型之我关注的人也关注了他,以他为准,我关注的人也关注了他顾名思义就是我关注的的列表元素所关注的人,例如,张三关注了{a,b},想要知道张三(他)是否也被a和b所关注,判断张三是否在a、b关注的集合里面。(SISMEMBER)

ZSet的常见应用场景

ZSet的常见操作

ZSet常用操作
ZADD key score member [[score member]…]	//往有序集合key中加入带分值元素
ZREM key member [member …]		//从有序集合key中删除元素
ZSCORE key member 			//返回有序集合key中元素member的分值
ZINCRBY key increment member		//为有序集合key中元素member的分值加上increment 
ZCARD key				//返回有序集合key中元素个数
ZRANGE key start stop [WITHSCORES]	//正序获取有序集合key从start下标到stop下标的元素
ZREVRANGE key start stop [WITHSCORES]	//倒序获取有序集合key从start下标到stop下标的元素

![未命名文件-导出 (3).png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/358803e461174c369f97b4aa40d3cb81~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=885&h=167&s=37151&e=png&b=f3f3f3)
![未命名文件-导出 (3).png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/fbecdb7a41404f3fa80ebcf06e5680b6~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=885&h=167&s=37151&e=png&b=f3f3f3)
Zset集合操作
ZUNIONSTORE destkey numkeys key [key ...] 	//并集计算
ZINTERSTORE destkey numkeys key [key …]	//交集计算

Zset的常见应用场景

  • 热点事件排行榜
  • 最近七日热点排行榜

Redis的一些指令的高阶用法

  • info,当前Redis或者是Redis集群的状态信息

  • sacn,类似于分页,但是页数不一定准确,SCAN cursor [MATCH pattern] [COUNT count] scan 参数提供了三个参数,第一个是 cursor 整数值(hash桶的索引值),第二个是 key 的正则模式, 第三个是一次遍历的key的数量(参考值,底层遍历的数量不一定),并不是符合条件的结果数量。第 一次遍历时,cursor 值为 0,然后将返回结果中第一个整数值作为下一次遍历的 cursor。一直遍历 到返回的 cursor 值为 0 时结束。 注意:但是scan并非完美无瑕, 如果在scan的过程中如果有键的变化(增加、 删除、 修改) ,那 么遍历效果可能会碰到如下问题: 新增的键可能没有遍历到, 遍历出了重复的键等情况, 也就是说 scan并不能保证完整的遍历出来所有的键, 这些是我们在开发时需要考虑的。

  • keys:全量遍历键,用来列出所有满足特定正则字符串规则的key,当redis数据量比较大时, 性能比较差,要避免使用