一、Redis的安装
1、下载与解压
wget http://download.redis.io/releases/redis-5.0.3.tar.gz
tar xzf redis-5.0.3.tar.gz
2、编译与安装
# 进入到解压目录
cd redis-5.0.3
# 进入到解压好的redis-5.0.3目录下,进行编译与安装
make
# 1. 修改 redis.conf 里的 daemonize 为 yes;(使用 ?daemon 搜索)
# 2. 开启远程连接, 配置修改为 bind 0.0.0.0
vi redis.conf
# 启动并指定配置文件
src/redis-server redis.conf
3、验证Redis的启动
# 验证启动是否成功
ps -ef | grep redis
# 进入redis客户端
src/redis-cli
# 退出客户端
quit
退出redis服务:
(1)pkill redis-server
(2)kill 进程号
(3)src/redis-cli shutdown
二、Redis的五种数据结构
1、字符串 String
1.1 String的常用命令
常用操作
- SET key value [EX seconds]|[PX milliseconds] [NX]|[XX] //存入字符串键值对
- 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
1.2 应用场景
单值缓存
SET key value
GET key
对象缓存
SET user:1 value(json格式数据)
(2) 需要存储记录: id=1,name=zhangsan,balance=1888,使用批量存储的方式,如下:
MSET user:1:name zhangsan user:1:balance 1888
MGET user:1:name user:1:balance
分布式锁
SETNX 作用:若key不存在,则执行成功返回1;若key存在,则执行失败返回0;
SETNX product:10001 true //返回1代表获取锁成功
SETNX product:10001 true //返回0代表获取锁失败
... 执行业务操作 ...
DEL product:10001 //执行完业务释放锁
SET key value [EX seconds] [PX milliseconds] [NX|XX]
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批量生成序列号并放入到应用的内存中提升性能
2、哈希 hash
2.1 hash 的常用命令
Hash常用操作
HSET key field value //存储一个哈希表key的键值;若key存在,则将 field value 直接插入;
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
2.2 应用场景
对象缓存
HMSET user {userId}:name zhangsan {userId}:balance 2000
HMSET user 1:name zhuge 1:balance 1888
HMGET user 1:name 1:balance
哈希与字符串比较,哈希更适合存储对象;
电商购物车
以用户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
优点:
(1) 同类数据归类整合储存,方便数据管理;
(2) 相比string操作消耗内存与cpu更小;
(3) 相比string储存更节省空间;
缺点:
(1) 过期功能不能使用在field上,只能用在key上;
(2) Redis集群架构下不适合大规模使用;
3、列表 list
3.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 //从key列表表头弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待
BRPOP key [key ...] timeout
3.2 应用场景
微博消息和微信公号消息
假如,小一关注了小李、小明;
(1)小李发了一个微博,消息ID为 1001,小一需要看到这条微博,则将这条微博的消息ID放到小一的消息中:
LPUSH msg:{小一的ID} 1001
(2)小明发了一个微博,消息ID为 1002,小一需要看到这条微博,则将这条微博的消息ID放到小一的消息中:
LPUSH msg:{小一的ID} 1002
(3)小一要查看最新微博消息的前5条消息
LANGE msg:{小一的ID} 0 5
4、集合 set
4.1 常用命令
SADD key member [member ...] //往集合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中
4.2 应用场景
微信小程序的抽奖
点击参与抽奖加入集合:SADD key {userlD}
查看参与抽奖所有用户:SMEMBERS key
抽取count名中奖者:SRANDMEMBER key [count] / SPOP key [count]
微信朋友圈点赞,收藏,标签
集合操作实现微博关注模型
假如关注的关系如下:
xiaoyi 关注的人: xiaoyiSet -- {huahua, mingming, liangliang}
huahua 关注的人: huahuaSet -- {xiaoyi, mingming, liangliang, bobo}
mingming 关注的人:mingmingSet -- {xiaoyi, huahua, liangliang, bobo, yuer}
xiaoyi(我) 进入到 huahua 的主页:
(1)共同关注的人:
sinter xiaoyiSet huahuaSet --> {mingming, liangliang}
(2)我关注的人也关注他(huahua):
mingming关注的人是否关注huahua: sismember mingmingSet huahua
liangliang关注的人是否关注huahuat:sismember liangliangSet huahua
(3)我可能认识的人:(花花关注的人我没有关注)
sdiff huahuaSet xiaoyiSet ---> {xiaoyi, bobo}
5、有序集合 zset
5.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 …] //交集计算