Redis核心数据结构与核心原理

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

 # 启动并指定配置文件
 

src/redis‐server redis.conf

(注意要使用后台启动,所以修改redis.conf里的daemonize改为yes)

# 验证启动是否成功

ps ‐ef | grep redis

# 进入redis客户端

src/redis‐cli

# 退出客户端

quit

# 退出redis服务:
(1)pkill redis‐server
(2)kill 进程号
(3)src/redis‐cli shutdown

Redis核心数据结构

五种数据结构

String结构

底层是简单动态字符串,Redis 是用 C 语言写的,但是对于Redis的字符串,却不是 C 语言中的字符串(即以空字符’\0’结尾的字符数组),它是自己构建了一种名为 简单动态字符串(simple dynamic string,SDS)的抽象类型,并将 SDS 作为 Redis的默认字符串表示。

字符串常用操作

  • 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

 String应用场景

单值缓存

  • SET  key  value     
  • GET  key     

对象缓存

1) SET  user:1  value(json格式数据)

2) MSET  user:1:name  zhangsan   user:1:balance  1888    

    MGET  user:1:name   user:1:balance

分布式锁

SETNX  product:10001  true         //返回1代表获取锁成功

SETNX  product:10001  true         //返回0代表获取锁失败

......执行业务操作

DEL  product:10001            //执行完业务释放锁

SET product:10001 true  ex  10  nx    //防止程序意外终止导致死锁

计数器

INCR article:readcount:{文章id}      

GET article:readcount:{文章id}

Web集群session共享

spring session + redis实现session共享

分布式系统全局序列号    

INCRBY  orderId  1000        //redis批量生成序列号提升性能

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}:name  lisi {userId}:balance  1888

HMSET  user  1:name  lisi 1:balance  1888

HMGET  user  1:name  1:balance 

电商购物车

1)以用户id为key

2)商品id为field

3)商品数量为value

购物车操作

添加商品:hset cart:1001 10088 1

增加数量:hincrby cart:1001 10088 1

商品总数:hlen cart:1001

删除商品:hdel cart:1001 10088

获取购物车所有商品:hgetall cart:1001

Hash结构优缺点

优点

1)同类数据归类整合储存,方便数据管理

2)相比string操作消耗内存与cpu更小

3)相比string储存更节省空间

缺点

  • 过期功能不能使用在field上,只能用在key上
  • Redis集群架构下不适合大规模使用,Hash slot = CRC16(key)%16384,集群模式hash存储过于集中

 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应用场景

常用数据结构

  • Stack(栈) = LPUSH + LPOP -> FILO
  • Queue(队列)= LPUSH + RPOP Blocking MQ(阻塞队列)= LPUSH + BRPOP

微博消息和微信公号消息

比如关注了MacTalk,备胎说车等大V

1)MacTalk发微博,消息ID为10018

        LPUSH  msg:{my-ID}  10018

2)备胎说车发微博,消息ID为10086

        LPUSH  msg:{my-ID} 10086

3)查看最新微博消息

        LRANGE  msg:{my-ID}  0  5

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应用场景

微信抽奖小程序

1)点击参与抽奖加入集合

SADD key {userlD}

2)查看参与抽奖所有用户

SMEMBERS key      

3)抽取count名中奖者

SRANDMEMBER key [count] / SPOP key [count]

微信微博点赞,收藏,标签

1) 点赞 SADD  like:{消息ID}  {用户ID}

2) 取消点赞 SREM like:{消息ID}  {用户ID}

3) 检查用户是否点过赞 SISMEMBER  like:{消息ID}  {用户ID}

4) 获取点赞的用户列表 SMEMBERS like:{消息ID}

5) 获取点赞用户数 SCARD like:{消息ID}

集合操作

SINTER set1 set2 set3 : { c }

SUNION set1 set2 set3 : { a,b,c,d,e }

SDIFF set1 set2 set3 : { a } 

集合操作实现微博微信关注模型

1) 诸葛老师关注的人:

zhugeSet-> {yangguo, sima, luban}

2) 杨过老师关注的人:  

yangguoSet--> {zhuge, sima, luban,guojia}

3) 司马老师关注的人:

simaSet-> {zhuge, yangguo, guojia, luban, xunyu)

4) 我和杨过老师共同关注:

SINTER zhugeSet yangguoSet--> {sima, luban}

5) 我关注的人也关注他(杨过老师):

SISMEMBER simaSet yangguo

SISMEMBER lubanSet yangguo

6) 我可能认识的人:

SDIFF yangguoSet zhugeSet->(zhuge, guojia}

集合操作实现电商商品筛选

SADD  brand:huawei  P30

SADD  brand:xiaomi  mi-6X

SADD  brand:iPhone iphone8

SADD os:android  P30  mi-6X

SADD cpu:brand:intel  P30  mi-6X

SADD ram:8G  P30  mi-6X  iphone8

SINTER  os:android  cpu:brand:intel  ram:8G ------>  {P30,mi-6X}

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下标的元素

Zset集合操作

  • ZUNIONSTORE destkey numkeys key [key ...]     //并集计算
  • ZINTERSTORE destkey numkeys key [key …]    //交集计算

Zset应用场景

Zset集合操作实现排行榜

1)点击新闻

ZINCRBY  hotNews:20190819  1  守护香港

2)展示当日排行前十

ZREVRANGE  hotNews:20190819  0  10  WITHSCORES

3)七日搜索榜单计算

ZUNIONSTORE  hotNews:20190813-20190819  7

hotNews:20190813  hotNews:20190814... hotNews:20190819

4)展示七日排行前十

ZREVRANGE hotNews:20190813-20190819  0  10  WITHSCORES

Redis核心原理

Redis的单线程和高性能

Redis 单线程为什么还能这么快?

因为它所有的数据都在内存中,所有的运算都是内存级别的运算,而且单线程避免了多线程的切换性 能损耗问题。正因为 Redis 是单线程,所以要小心使用 Redis 指令,对于那些耗时的指令(比如 keys),一定要谨慎使用,一不小心就可能会导致 Redis 卡顿。

Redis 单线程如何处理那么多的并发客户端连接?

Redis的IO多路复用:redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放到 文件事件分派器,事件分派器将事件分发给事件处理器。 Nginx也是采用IO多路复用原理解决C10K问题

# 查看redis支持的最大连接数,在redis.conf文件中可修改,# maxclients 10000
127.0.0.1:6379> config get maxclients
##1) "maxclients"
##2) "10000"

 其他高级命令

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

scan:

渐进式遍历键 SCAN cursor [MATCH pattern] [COUNT count] scan 参数提供了三个参数,第一个是 cursor 整数值,第二个是 key 的正则模式,第三个是一次遍 历的key的数量,并不是符合条件的结果数量。第一次遍历时,cursor 值为 0,然后将返回结果中第 一个整数值作为下一次遍历的 cursor。一直遍历到返回的 cursor 值为 0 时结束。

Info:

查看redis服务运行信息,分为 9 大块,每个块都有非常多的参数,这 9 个块分别是:

Server 服务器运行的环境参数

Clients 客户端相关信息

Memory 服务器运行内存统计数据

Persistence 持久化信息 Stats 通用统计数据

Replication 主从复制相关信息

CPU CPU 使用情况

Cluster 集群信息

KeySpace 键值对统计数量信息 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小强同志

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值