MO_or关于Redis应用篇

redis.jpg

一、引言

本篇文章是Redis的应用篇,若对Redis还不太了解的读者,可以先阅读下笔者的《MO_or关于Redis入门篇

本篇文章将主要探讨以下几点:

  1. Redis的安装(VMware10.0.2 + CentOS 6.5 + Redis 5.0.8 + Xshell)
  2. Redis的五种数据结构(常用的)
  3. string(字符串)
  4. hash(哈希)
  5. list(列表)
  6. set(集合)
  7. zset(有序集合)

二、Redis的安装(可跳过)

这里就不赘述VMware和Linux的安装了,读者可以通过百度或谷歌进行下载并安装

笔者推荐Linux初学者使用Mint和Ubuntu,特别是使用Windows或Mac对可视化界面依赖较高的用户

若目前并不计划学习Linux,Redis也提供了Windows版本Redis-Windows,只需下载解压缩,依次运行redis-server.exe,redis-cli.exe
但笔者并不推荐,因为windows版本都是较老的版本,对于新版本特性的学习是并不具备的,仅能用作入门练习使用(熟悉指令)


下面开始在Linux安装Redis
请确保VMware已安装VMware Tools,否则无法从Windows系统粘贴文件到Linux系统中

1. 下载Redis 5.0.8

download redis.png

2. 将下载的Redis粘贴到Linux系统中

若使用的是CentOS 6.5没有可视化界面的话依次执行如下命令:

yum groupinstall "X Window System" -y
yum groupinstall "Desktop" -y
startx

3. 安装Redis

打开终端,左上角

CentOS终端.png

解压Redis,进入解压文件,编译源码,依次执行如下命令

tar xzf redis-5.0.8.tar.gz
cd redis-5.0.8
make

若遇到异常一:make[2]: cc: Command not found
执行 yum install gcc-c++

若遇到异常二:couldn't execute "tclsh8.5": no such file or directory
执行 yum install -y tcl

若遇到异常三:zmalloc.h:51:31: error: jemalloc/jemalloc.h: No such file or directory
执行 make distclean 再执行 make

4. 运行Redis

打开终端,进入redis文件下的src,依次启动

cd Desktop
cd redis-5.0.8
cd src
./redis-server

5. Xshell连接Redis

查询CentOS ip,执行:ip add
CentOS默认只开放端口22,默认无账号密码
创建Xshell连接,输入ip和端口
启动Redis客户端

cd Desktop
cd redis-5.0.8
cd src
./redis-cli

三、Redis的五种数据结构

这里先列出各种数据结构的大概图形,读者可以先大致了解一下,下面再详细讲解各个数据结构

Redis五种数据结构.png

四、string

4.1 常用操作

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  user:1  value(json格式数据)

方式二(推荐):MSET  user:1:name  mo_or   user:1:balance  0
             MGET  user:1:name   user:1:balance
             
方式二操作字段时更加灵活,内存占用也比方式一更小

分布式锁(简单版)

set 命令若重复执行 key值 相同的指令,value值 会被更改
setnx 命令只能添加 key 不存在的 value

SETNX  product:10086  true             //返回 1 代表获取锁成功
SETNX  product:10086  true             //返回 0 代表获取锁失败
/** 执行业务操作 **/
DEL  product:10086                     //执行完业务释放锁
SET product:10086 true  ex  10  nx     //防止程序意外终止导致死锁

4.2 应用场景

计数器

INCR article:readcount:{文章id}         //每点击文章执行一次,阅读量加一
GET article:readcount:{文章id}          //获取文章阅读数

Web集群session共享

spring session + redis实现session共享
(将在之后《进阶篇》中详细讲解)

分布式系统全局序列号

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

(将在之后《进阶篇》中详细讲解)

五、hash

结合上面给出的模型图可以看到,hash是key - filed - value 的形式,即 key value 中的 value 又是一个 key value,只不过这个key 叫 filed
(可以想象成 Java 中 map集合 嵌套 map集合)

5.1 常用操作

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

对象缓存

HMSET  user  {userId}:name  mo_or {userId}:balance  0
HMSET  user  1:name  mo_or 1:balance  0  2:name  hero_orz 2:balance  0
HMGET  user  1:name  1:balance  

redis-hash.png

优点

  1. 同类数据归类整合储存,方便数据管理
  2. 相比string操作消耗内存与cpu更小
  3. 相比string储存更节省空间

缺点

  1. 过期功能不能使用在field上,只能用在key上
  2. Redis集群架构下不适合大规模使用

5.2 应用场景

电商购物车

  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                  //获取购物车所有商品

购物车.png

六、list

6.1 常用操作

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  n(s)    //从 key 列表表头弹出一个元素, 若列表中没有元素,阻塞等待 timeout 秒,如果 timeout=0,一直阻塞等待
BRPOP  key  [key ...]  timeout  n(s)    //从 key 列表表尾弹出一个元素,若列表中没有元素,阻塞等待 timeout 秒,如果 timeout=0,一直阻塞等待

常见数据结构(使用频率较少)

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

redis-list.png

6.2 应用场景

订阅号

下图列表中关注了中国国家地理,四川教育发布

LPUSH  msg:{userId}  10001    //中国国家地理发消息,消息 ID 为 10001
LPUSH  msg:{userId} 10006     //四川教育发布发消息,消息 ID 为 10006
LRANGE  msg:{userId}  0  5    //查看用户最新订阅号消息

订阅号.png

七、set

7.1 常用操作

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 中删除

运算操作

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

集合操作

SINTER set1 set2 set3 -> { c }
SUNION set1 set2 set3 -> { a,b,c,d,e }
SDIFF set1 set2 set3 -> { a }

redis-set.png

7.2 应用场景

抽奖小程序

srandmember指令会按 key 从集合中随机取出 count 个数量的值
spop和srandmember功能类似,但会将取出的值从集合中去除掉

SADD key {userId}                               //点击参与抽奖加入集合
SMEMBERS key                                    //查看参与抽奖所有用户
SRANDMEMBER key [count] / SPOP key [count]      //抽取 count 名中奖者

抽奖.PNG

点赞,收藏,关注(暗示一波(●'◡'●))

SADD  like:{消息ID}  {用户ID}              //点赞
SREM like:{消息ID}  {用户ID}               //取消点赞
SISMEMBER  like:{消息ID}  {用户ID}         //检查用户是否点过赞
SMEMBERS like:{消息ID}                     //获取点赞的用户列表
SCARD like:{消息ID}                        //获取点赞用户数 

八、zset

8.1 常用操作

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

集合操作

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

8.2 应用场景

排行榜

ZINCRBY  hotNews:20200520  1  最全280家5A级景区名单             //点击新闻,点击数加一
ZREVRANGE  hotNews:20200520  0  10  WITHSCORES                 //展示当日排行前十 
ZUNIONSTORE  hotNews:20200514-20200520  7  
hotNews:20200514  hotNews:20200515  ...  hotNews:20200520      //七日搜索榜单计算
ZREVRANGE hotNews:20200514-20200520  0  10  WITHSCORES         //展示七日排行前十

排行榜.png

九、更多场景

  • 关注模型
  • 商品筛选
  • <附近的人>
  • <摇一摇>
  • <抢红包>
  • <附近的车>
  • <附近的餐馆>
  • 搜索自动补全
  • 布隆过滤器

十、参考

十一、最后

若有不足,敬请指正
虚心若愚,求知若渴

你可能感兴趣的:(redis,应用,实践,数据库,nosql)