简介
key-value 存储系统,是跨平台的非关系型数据库。
Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。
原子性操作、持久化、支持发布/订阅模式、单线程模型、主从复制
应用场景
- 缓存(数据查询、短连接、新闻内容、商品内容等)
- 分布式集群架构中的session分离
- 聊天室的在线好友列表
- 任务队列(秒杀、抢购、12306等)
- 应用排行榜
- 网站访问统计
- 数据过期处理(精确到毫秒)
客户端
Redis是服务端,要操作服务端是通过客户端
bash
# 连接服务端
./redis-cli
#指定连接redis服务的ip和端口
./redis-cli -h ip -p 端口
# ping测试连接是否正常
ping #pong则是正常
# 设置 获取数据
set name zhangsan
get
数据类型
- **string(字符串):**基本的数据存储单元,可以存储字符串、整数或者浮点数。
- **hash(哈希):**一个键值对集合,可以存储多个字段。
- **list(列表):**一个简单的列表,可以存储一系列的字符串元素。
- **set(集合):**一个无序集合,可以存储不重复的字符串元素。
- **zset(sorted set:有序集合):**类似于集合,但是每个元素都有一个分数(score)与之关联。
- **位图(Bitmaps):**基于字符串类型,可以对每个位进行操作。
- **超日志(HyperLogLogs):**用于基数统计,可以估算集合中的唯一元素数量。
- **地理空间(Geospatial):**用于存储地理位置信息。
- **发布/订阅(Pub/Sub):**一种消息通信模式,允许客户端订阅消息通道,并接收发布到该通道的消息。
- **流(Streams):**用于消息队列和日志存储,支持消息的持久化和时间排序。
- **模块(Modules):**Redis 支持动态加载模块,可以扩展 Redis 的功能
String
redis最基本的类型;二进制安全的;最大存储512MB
bash
set key value //设置键的值
get key //获取键的值
incr key //将key的值加1
decr key //将key的值减1
append key value //将值追加到键的值之后
strlen str //获取字符串长度
mset k1,v1,k2,v2,k3,v3
mget k1 k3 //同时设置、获取多个键值
Hash
键值对集合,string类型的field和value的映射表。
bash
hset key field value //设置哈希表中字段的值
hget key field //获取哈希表中字段的值
hmset key field value [field value ...] //一次可设置多个字段值
hmget key field [field...] //一次可获取多个字段值
hgetall key //获取哈希表中所有字段和值
hdel key field //删除哈希表中的一个或多个字段
bash
hexists key field //查看是否存在该字段
hdel ky field [field...] 删除一个或多个字段,返回值是被删除的字段个数
hkeys key
hvals key 只获取字段名或字段值
hlen key 获取字段数量
List
列表类型可存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获取列表的某一个片段。
内部是使用双向链表实现的,获取越接近两端的元素速度就越快。
bash
lpush key value [value...] 左边增加
rpush key value [value...] 右边增加
lpop key 左边弹出
rpop key 右边弹出
llen key 获取元素个数
lrange key start stop 获取列表中的某一片段,将返回start、stop之间的所有元素(包含两端的元素),索引从0开始。索引可以是负数
bash
lrem key count value 删除列表中前count个值为value的元素,返回实际删除的元素的个数【count>0 从列表左边删除 <0 右边 =0 所有值】
LINDEX key index
LSET key index value 获得/设置指定索引的元素值
LTRIM key start stop 只保留列表指定片段,指定范围和LRANGE一致
LINSERT key BEFORE|AFTER pivot value 向列表中插入元素,该命令首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面。
RPOPLPUSH source destination 将元素从一个列表转移到另一个列表中
set
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
集合对象的编码可以是 intset 或者 hashtable。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
bash
增加/删除元素
SADD key member [member ...]
SREM key member [member ...]
获得集合中的所有元素
SMEMBERS key
判断元素是否在集合中,无论集合中有多少元素都可以极速的返回结果。
SISMEMBER key member
sorted set
Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
bash
增加元素:向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。
ZADD key score member [score member ...]
获取元素的分数
ZSCORE key member
获得排名在某个范围的元素列表
ZRANGE key start stop [WITHSCORES] //照元素分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端的元素)、、
ZREVRANGE key start stop [WITHSCORES] 照元素分数从大到小的顺序返回索引从start到stop之间的所有元素(包含两端的元素)
如果需要获得元素的分数的可以在命令尾部加上WITHSCORES参数
获得指定分数范围的元素
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
增加某个元素的分数,返回值是更改后的分数。
ZINCRBY key increment member
获得集合中元素的数量
ZCARD key
获得指定分数范围内的元素个数
ZCOUNT key min max
bash
按照排名范围删除元素
ZREMRANGEBYRANK key start stop
按照分数范围删除元素
ZREMRANGEBYSCORE key min max
获取元素的排名
ZRANK key member
ZREVRANK key member
set和sorted set的区别
Set与Sorted Set最根本的区别在于是否有序------Set存储无序的唯一元素,Sorted Set则通过分数(Score)为每个元素排序。

持久化
支持两种方式持久化:RDB或AOF(单独使用或二者结合)
RDB持久化
默认采用;通过快照完成,符合一定条件时Redis自动将内存中的数据进行快照并持久化到硬盘
redis.conf配置文件中 save 900 1含义:900秒钟内至少1个键被更改则进行快照
dir (./ ) 指定rdb快照文件的位置
dbfilename (dump.rdb) 指定rdb快照文件的名称
MySQL中InnoDB引擎根据这.frm .ibd两个文件定位和管理一张表:

AOF持久化
默认关闭;
开启:appendonly yes
每执行一条会更改Redis中的数据的命令,Redis会将该命令写入硬盘中的AOF文件。
|---------------|------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------|
| | RDB(快照持久化,默认启用) | AOF(追加日志,默认关闭) |
| 工作原理与实现方式 | 在满足特定触发条件(如 save 900 1 表示 900 秒内至少 1 个键被更改)时,Redis 会自动将内存中的全部数据生成一个快照(snapshot)并保存到硬盘的 dump.rdb 文件中。 | 需要手动在配置文件中通过 appendonly yes 开启。其原理是将每一条会更改 Redis 数据的命令都实时追加写入到硬盘的 AOF 日志文件中。 |
| 数据保存格式 | 某个时间点的完整数据二进制快照文件 | 导致数据发生变化的所有命令的日志文本文件。 |
| 性能与数据安全 | 性能更高,因为生成快照是周期性操作,且恢复大数据集时速度更快。但在两次快照之间如果服务器宕机,会丢失最后一次快照之后的数据。 | 数据安全性更高,因为它可以配置为每秒同步或每次命令写入,保证命令不丢失。但AOF文件通常比RDB文件更大,恢复速度也可能更慢。 |
主从复制
当Redis服务器的硬盘损坏了可能会导致数据丢失,主从复制可避免单点故障。

说明:
- 主redis中的数据有两个副本(replication)即从redis1和从redis2,即使一台redis服务器宕机其它两台redis服务也可以继续提供服务。
- 主redis中的数据和从redis上的数据保持实时同步,当主redis写入数据时通过主从复制机制会复制到两个从redis服务上。
- 只有一个主redis,可以有多个从redis。
- 主从复制不会阻塞master,在同步数据时,master 可以继续处理client 请求。
- 一个redis可以即是主又是从。
主Redis配置
redis.conf:
bash
bind 0.0.0.0 #允许从库通过外部 IP 连接
protected-mode no #关闭保护模式,否则拒绝外部连接
requirepass 你的主库密码 #设置主库密码,增强安全性
从Redis配置
redis.conf:
bash
bind 0.0.0.0 //允许外部客户端查询从库数据
protected-mode no //关闭保护模式,否则拒绝外部连接
port 从库端口(如 6381)//每个从库必须使用不同端口
# slaveof <masterip> <masterport>
slaveof 101.42.40.144 6379 //指定主库地址,建立主从关系
masterauth 主库密码 //和主库 requirepass 保持一致,否则认证失败无法同步
slave-read-only yes // 保持默认只读,防止从库写入数据(可选)
验证主从连接
bash
# 验证主从连接状态
./redis-cli -p 6381(从库端口号) info replication
# 验证主库运行状态
ps -ef | grep redis-server
# 启动库
./redis-server /usr/local/redis/6379/bin/redis.conf
# 从库查询
./redis-cli -p 6381
