Centos7+下Redis单节点搭建
环境准备gcc安装
yum install gcc
下载Redis5.0.3安装包
wget http://download.redis.io/releases/redis‐5.0.3.tar.gz
解压安装包到/usr/local下
tar -zxvf redis‐5.0.3.tar.gz -C /usr/local
mv /usr/local/redis-5.0.3 /usr/local/redis
编译解压的安装包
cd /usr/local/redis
make
修改配置文件redis.conf
daemonize yes #后台启动
protected‐mode no #关闭保护模式,开启的话,只有本机才可以访问redis
# 需要注释掉bind
#bind 127.0.0.1(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户端通过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可)
启动redis服务
src/redis‐server redis.conf
查看redis进程是否存在
ps -aef|grep redis
客户端连接&退出
src/redis-cli
#退出客户端
quit
退出redis服务
#1
pkill redis‐server
#2
kill 进程号
#3
src/redis‐cli shutdown
Redis核心数据结构
Redis比较常用的核心五种数据结构:String、Hash、List、Set、ZSet。
数据结构帮助命令查看:> help @数据结构,如 > help @String
String 结构
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 |
String 应用场景
单值缓存
SET key value
GET key
对象缓存
SET user:1 value(json格式数据)
MSET user:1:name warrior user:1:age 30
MGET user:1:name user:1:age
分布式锁
SETNX product:100001 true //返回1代表获取锁成功,返回0代表获取锁失败
DEL product:100001 //执行完操作,释放锁
SET product:100001 true ex 10 nx //获取锁,设置锁超时时间
计数器
INCR article:readcount:{文章Id}
GET article:readcount:{文章Id}
Web集群session共享
Spring session + redis 实现session共享
分布式系统全局序列号
INCRBY orderId 1000
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 的优缺点
优点
同类数据归类整合存储,方便数据管理。
相比String操作消耗内存与CPU更少。
相比String存储更节省空间。
缺点
过期功能不能使用在field上,只能在key上。
Redis集群架构下不太适合大规模使用。
hash 应用场景
对象缓存
HMSET user {userId}:name warrior {userId}:age 30
电商购物车
添加商品:HSET car:{userId} {productId} {商品数量}
增加商品数量:HINCRBY car:{userId} {productId} {商品数量}
商品总数:HLEN car:{userId}
删除商品:HDEL car:{userId} {productId}
获取购物车所有商品:HGETALL car:{userId}
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
队列(Queue):LPUSH + RPOP
阻塞队列(Blocking Queue):LPUSH + BRPOP
微博消息&公众号消息
消息发送:LPUSH msg:{userId} {消息Id}
消息获取:LRANG msg:{userId} start stop
Set 结构
Set 操作常用命令
命令 | 说明 |
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个元素,元素不从集合删除 |
SPOP key [count] | 从集合key中选出count个元素,元素从集合删除 |
SINTER key [key ...] | 交集运算 |
SINTERSTORE destination key [key ...] | 将交集结果存入新的destination集合中 |
SUNION key [key ...] | 并集运算 |
SUNIONSTORE destination key [key ...] | 将并结运算结果存入新的destination集合中 |
SDIFF key [key ...] | 差集运算 |
SDIFFSTORE destionation key [key ...] | 将差集运算结果导入新的destination集合中 |
Set 应用场景
抽奖小程序
点击参与抽奖:SADD key {userId}
查看参与用户:SMEMBERS key
抽取count名中奖:SRANGMEMBER key [count] 或 SPOP key [count]
微信/微博点赞、收藏、标签
点赞:SADD like:{消息Id} {userId}
取消点赞:SREM like:{消息Id} {userId}
检查用户是否点赞:SISMEMBER like:{消息Id} {userId}
获取点赞用户列表:SMEMBERS like:{消息Id}
获取点赞用户数:SCARD like:{消息Id}
集合操作实现社交关注模型
warrior关注的人:warriorSet -> {sun、xiaomage}
sun关注的人:sunSet -> {warrior、xiaomage、Alice}
xiaomage关注的人:xiaomageSet -> {warrior、sun、Blob}
warrior和sun共同关注的人:SINTER warriorSet sunSet
warrior关注的人也关注sun:
SISMEMBER xiaomageSet sun
SISMEMBER sunSet sun
warrior可能认识的人:SDIFF sunSet warriorSet
集合实现电商商品筛选
SADD brand:huawei P40
SADD brand:xiaomi mi-10
SADD brand:iPhone iphone12
SADD os:android P40 mi-10
SADD cpu:brand:intel P40 mi-10
SADD ram:8G P40 mi-10 iphone12
SINTER os:android cpu:brand:intel ram:8G → {P40,mi-10}
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下标的元素 |
ZUNIONSTORE destkey numkeys key [key ...] | 并集计算 |
ZINTERSTORE destkey numkeys key [key …] | 交集计算 |
ZSet 应用场景
集合操作实现排行榜
点击新闻:ZINCRBY hotNews:20230227 1 xxxxxx
展示当日排行前5:ZREVRANGE hotNews:20230227 0 4 WITHSCORES
三日内搜索榜单计算:ZUNIONSTORE hotNews:20230225-hotNews:20230227 3 hotNews:20230225 hotNews:20230226 hotNews:20230227
展示三日排行前6:ZREVRANGE hotNews:20230225-hotNews:20230227 0 5 WITHSCORES