一、引言
本篇文章是Redis的应用篇,若对Redis还不太了解的读者,可以先阅读下笔者的《MO_or关于Redis入门篇》
本篇文章将主要探讨以下几点:
- Redis的安装(VMware10.0.2 + CentOS 6.5 + Redis 5.0.8 + Xshell)
- Redis的五种数据结构(常用的)
- string(字符串)
- hash(哈希)
- list(列表)
- set(集合)
- 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
2. 将下载的Redis粘贴到Linux系统中
若使用的是CentOS 6.5没有可视化界面的话依次执行如下命令:
yum groupinstall "X Window System" -y
yum groupinstall "Desktop" -y
startx
3. 安装Redis
打开终端,左上角
解压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的五种数据结构
这里先列出各种数据结构的大概图形,读者可以先大致了解一下,下面再详细讲解各个数据结构
四、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
优点
- 同类数据归类整合储存,方便数据管理
- 相比string操作消耗内存与cpu更小
- 相比string储存更节省空间
缺点
- 过期功能不能使用在field上,只能用在key上
- Redis集群架构下不适合大规模使用
5.2 应用场景
电商购物车
- 以用户id为key
- 商品id为field
- 商品数量为value
购物车操作
hset cart:1001 10088 1 //添加商品
hincrby cart:1001 10088 1 //增加数量
hlen cart:1001 //商品总数
hdel cart:1001 10088 //删除商品
hgetall cart:1001 //获取购物车所有商品
六、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
6.2 应用场景
订阅号
下图列表中关注了中国国家地理,四川教育发布
LPUSH msg:{userId} 10001 //中国国家地理发消息,消息 ID 为 10001
LPUSH msg:{userId} 10006 //四川教育发布发消息,消息 ID 为 10006
LRANGE msg:{userId} 0 5 //查看用户最新订阅号消息
七、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 }
7.2 应用场景
抽奖小程序
srandmember指令会按 key 从集合中随机取出 count 个数量的值
spop和srandmember功能类似,但会将取出的值从集合中去除掉
SADD key {userId} //点击参与抽奖加入集合
SMEMBERS key //查看参与抽奖所有用户
SRANDMEMBER key [count] / SPOP key [count] //抽取 count 名中奖者
点赞,收藏,关注(暗示一波(●'◡'●))
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 //展示七日排行前十
九、更多场景
- 关注模型
- 商品筛选
- <附近的人>
- <摇一摇>
- <抢红包>
- <附近的车>
- <附近的餐馆>
- 搜索自动补全
- 布隆过滤器
十、参考
十一、最后
若有不足,敬请指正
虚心若愚,求知若渴