功能特性
- 安全性:
- 密码保护:通过设置密码保护访问
- ACL: 用户访问控制列表
- 多种数据结构
- 事务: 支持将多个命令打包执行,保持原子性
- 持久化
- 复制:支持主从复制,实现数据的冗余和读取扩展
- 哨兵系统:用于监控主服务器的状态,自动进行故障转移
- 集群:通过Redis Cluster实现数据分片和高可用性
- Lua脚本:支持在Redis服务器上执行Lua脚本
- 慢查询日志:记录执行时间超过指定阈值的查询
使用
启动服务器
redis-server
启动服务
redis-cli
主从部署
单机部署缺点
- 如果单机部署发生故障,那么整个redis服务将不能使用。
- 单机部署会成为性能屏障。
- 所有数据存在单个节点上,如果出现故障,同时未持久化,这部分数据很容易丢失不易恢复。
主从部署解决了上述3个问题。主节点处理写请求,同步数据给从节点,从节点执行读请求。如果主节点发生故障未将从节点升级到主节点还是无法执行写请求。
负载均衡
读写分离,主节点写服务,从节点读服务。写少读多的场景下,提高并发量。
主节点
redis-server redis.conf
从节点
redis-server redis-slave.conf
redis-cli -p 6380
从节点使用6380端口,在redis-slave.conf在中设置端口6380, replicaof 127.0.0.1 6379
查看主从信息
info replication
在从节点不能写,只能在master写
127.0.0.1:6380> set key1 value1
(error) READONLY You can't write against a read only replica.
127.0.0.1:6380>
缺点
-
复制延时,信号衰减
由于所有的写操作都是在master上操作,然后同步到slave上,所以master同步到slave机器上有一定的延迟,当系统繁忙的时候,延迟会更加严重,slave的数量也会导致这个问题
-
master挂了
如果master挂了默认情况不会在slave中自动重选一个master,需要人工干预
哨兵部署
哨兵节点监控主从节点的状态,并在故障发生时自动完成故障发现和转移
集群部署
集群将数据分散到多个节点,突破了Redis单机内存大小限制,同时每个主节点都可以对外提供读写服务
Strings
场景
- 缓存session、token、图片地址、序列化后的对象
- SET
- GET
SET session1 session_value1 GET session1 - 计数的场景:用户单位时间的请求数、页面的访问数
- SET
- GET
- INCR
- DECR
SET num1 1 INCR num1 GET num1 DECR num1 - 分布式锁
- SETNX key value
如果再次SET返回0,需要DEL之后才能SET成功SETNX lock1 1
- SETNX key value
List
Redis列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素在头部或尾部。
场景
- 信息流:文章、动态
- LPUSH、LRANGE
0是起始索引,-1是结束索引,表示最后一个元素结束LPUSH message 1 2 3 LRANGE message 0 -1 - 实现栈
- LPUSH、LPOP
- 实现队列
- RPUSH、LPOP
Hash
Redis的Hash是一个String类型的field-value的映射表,适合用于存储对象,也可以直接修改对象中的某些字段值
场景
- 用户信息、商品信息、文章信息
HSET设置单个字段的值HSET user:001 name azhong age 20HMSET设置多个字段的值HMGET获取多个字段的值HGET user:001 name
- 购物车信息
HSET加入购物车HINCR加数量HLEN获取所有商品数量HDEL删除商品HGETALL获取所有商品
Set
无序集合,元素唯一
场景
- 需要随机获取数据源中的元素的场景
- 抽奖系统
- SADD(加入抽奖系统) SMEMBERS(查看所有抽奖用户)SPOP(随机获取集合中的元素并移除,适合不允许重复中奖的场景)
- 需要存放的数据不能重复的场景
- 文章点赞、动态点赞
- SADD(点赞)SREM(移除点赞)SISMEMBER(检查用户是否点赞过)SMEMBERS(获取点赞列表)SCARD(获取点赞用户数)
命令
SADD key value
SADD name name1
SADD name name2
SADD name name3
SMEMBERS name
SPOP name
SRANDMEMBER name
SREM name name1
SISMEMBER name name3
SCARD name
Sorted Set
相对set增加一个double类型的分数,使元素能有序
场景
- 直播间送礼排行榜、朋友圈微信步数排行……
- ZINCR(+1)、ZREVRANGE(从大到小排序)、ZUNIONSTORE(多日搜索汇总)
命令
ZADD (key) (score) meber1 [score2 member2]:添加元素
ZCARD (key):获取元素
ZREM (key) (member):移除元素
ZSCORE (key) (member) :获取指定集合指定元素的score
ZRANGE (key) start stop:通过索引返回区间内的成员(低到高)
ZREVRANGE (key) start stop:(高到低)
Bitmap
Bitmap存储的是连续的二进制数字,通过Bitmap只需要一个bit来表示某个元素对应的值或状态
场景
- 用户签到情况、活跃用户情况、用户行为统计
命令
SETBIT (key) (index) (0/1)
GETBIT (key) (index)
BITCOUNT (key) (0/1)
BITPOS (key) (0/1):第一次出现这个下标的位置
HyperLogLog超日志
不是redis特有,是基数计数概率算法
命令
PFADD (key) (value)
PFCOUNT (key)
PFMERGE (key) (key1) (key2)
GEO
存储地理位置信息,基于Sorted Set实现
命令
GEOADD city 113.00000 28.21667 changsha
GEOPOS city changsha
GERODIST city changsha beijing:直线距离返回米,可以指定单位如km
GEORADIUS city 112 28 500 KM:返回方圆500km的元素
Pub/Sub发布/订阅
命令
SUBSCRIBE (key)PUBLISH (key)