1. Redis概述
Remote Dictionary Server,远程字典数据库,一种NoSQL(Not Only SQL),非关系型数据库,相比关系型数据库,效率更高。默认端口号6379
2. 安装Redis
- 下载tar.gz压缩包到Linux
- 解压:tar -zxvf 压缩包名 -C 地址
- 安装gcc:yum -y install gcc
- 编译:make
- 使redis命令全局可用:make install
3. 使用Redis
3.1 启动redis服务
- 前台启动:redis-server
- 后台启动(常用):redis-server &
3.2 关闭redis服务
- redis-cli shutdown
- kill -9 pid(redis的pid):不推荐
3.3 redis客户端
使用redis-cli
使用redis自带的客户端
-p:指定端口号
-h:指定主机ip
3.4 其他命令
3.4.1 Linux命令行环境下:
redis-benchmark
:性能自测
3.4.2 redis客户端环境下:
ping
:服务运行检查,返回pong即代表正常
info
:查看内部统计信息
info [xxx]
:查看指定部分xxx的统计信息,一般用于查看集群信息,常用的有info Replication
config set protected-mode no
:关闭保护模式
3.5 redis的数据库实例
redis的数据库实例作用与MySQL的数据库实例类似,不同的是实例的创建和维护只能由redis来做,默认自动创建16个,编号0-15,使用编号来调用实例,默认调用0号。
可通过配置文件,指定自动创建的实例个数
select index
:切换数据库实例,index代表实例编号
dbsize
:返回当前数据库实例的数据条数(key的数量)
keys *
:查看当前数据库实例中所有的key
flushdb
:删除当前数据库实例
flushall
:删除所有数据库实例
config get *
:查看redis中所有的配置信息
config get xxx
:查看redis中指定xxx的配置信息
4. Redis的五种数据结构
java中的数据存储到redis的对应关系
redis的数据结构 | java中的数据结构 |
---|---|
string | String |
list | List |
set | Set |
hash | Object |
zset | 可排序的set |
string:一个key,一个value,最大512M
list:一个key,多个value,按照插入顺序排序
set:一个key,多个value,无序不重复
hash:key1,value1;key2,value2…多个k/v的集合,适合存储对象
zset:有序不重复,每个元素会关联一个分数(分数可重复),根据分数来排序
5. 常用命令
类似MySQL的crud语句,操作数据用
5.1 key的操作命令
keys xxx
:查询以xxx为key的数据,xxx→pattern,可使用通配符替代:
- *:表示0或多个字符,如keys *:查询所有的key
- ?:表示单个字符,如wo?d,匹配word,wood等
- []:表示[]中的任意一个字符,如wo[or]d,匹配word,wood,不匹配wold,woord
exists xxx
:判断以xxx为key的数据是否存在,存在返回1,不存在返回0
exists key [xxx, xxx, xxx]
:判断以[]中的xxx为key的数据是否存在,存在返回存在的总数,不存在返回0
move key index
:移动指定key到指定的index数据库实例
select num
:切换到num库
ttl xxx
:查看xxx的剩余生存时间,redis是基于内存的数据库,会自动将剩余生存时间为0的数据消除。如果没有设置生存时间,则返回-1,没有此key,返回-2
expire key seconds
:设置key的最大生存时间,单位是s
type xxx
:查看xxx的数据类型
rename xxx newXxx
:重命名xxx的key为newXxx
del xxx1 xxx2 xxx3
:删除指定的key,返回实际删除的数量
5.2 string字符串类型数据的操作命令
一般常用在需要计数的场景,比如用户的访问次数、热点文章的点赞转发数量等等。
set xxx value
:将xxx这个string类型的数据存入到redis中,如果xxx已经存在,则会覆盖旧数据
get xxx
:获取以xxx为key的字符串数据
append key value
:给字符串追加内容,返回追加之后的字符串的长度,key如果不存在,则创建并设置内容
strlen xxx
:获取字符串长度
incr xxx
:对字符串数值进行+1,如果xxx不存在,则创建新值,初始化为0,再执行incr操作,如果value无法运算,报错
decr xxx
:-1
incrby key offset
:对key数值加offset
getrange xxx startIndex endIndex
:截取以xxx为key的value中从startIndex到endIndex的子字符串,下标从0开始
setrange xxx startIndex x1
:用x1覆盖以xxx为key的value,从startIndex开始,下标从0开始
setex key seconds value
:同时存入数据和设置生命周期
setnx key value
:如果不存在(not exists)就存储,存储失败返回0
mset k1 v1 k2 v2...
:批量存储
5.3 list链表类型数据的操作命令
发布与订阅或者消息队列
lpush xxx x1 x2 x3
:将一个list存入,xxx是key,x1, x2, x3是value,分次插入表头,所以最终顺序是x3, x2, x1,如果列表中本来有元素,则是添加
rpush
:分次插入表尾
lrange xxx
:获取指定xxx列表的元素
lrange xxx startIndex endIndex
:获取指定xxx列表指定下标区间的元素
lpop xxx
:移除并返回xxx的表头元素
rpop xxx
lindex xxx index
:获取index下标的元素
llen xxx
:获取xxx的长度
lrem xxx count value
:根据count删除xxx中跟value相等的数据,count>0从左侧开始删除,count<0从右侧开始删除,count=0表示删除所有
5.4 set集合类型数据的操作命令
需要存放的数据不能重复以及需要获取多个数据源交集和并集等场景,比如,你可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis 可以非常方便的实现如共同关注、共同粉丝、共同喜好等功能
sadd xxx v1, v2, v3
:为xxx加入一个或多个元素,重复的自动忽略,返回实际加入的数量
smembers xxx
:获取xxx集合中所有的元素
sismember xxx v1
:判断v1元素在xxx中是否存在,不存在返回0,存在返回1
scard xxx
:获取xxx的长度
srem xxx v1 v2...
:从xxx移除一个或多个元素,不存在的忽略,返回成功移除的个数
srandmember xxx
:获取xxx中的任一元素,由于set的特性,该获取具有随机性
sranmember xxx count
:获取count数量的元素,大于0不能重复,小于0可能重复
spop xxx [count]
:随机移除一个或多个
smove xxx1 xxx2 v1
:将xxx1中的v1移动到xxx2
sdiff xxx1 [xxx2 xxx3...]
:获取xxx1有,但其他集合没有的元素
sinter xxx1 xxx2 [xxx3...]
:求交集
sunion xxx1 xxx2
:求并集
5.5 hash哈希类型数据的操作命令
特别适合用于存储对象,后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值。 比如我们可以 hash 数据结构来存储用户信息,商品信息等等。
哈希类型的数据操作总的思想是通过key和field操作value,key是数据标识,field是域,value是我们感兴趣的业务数据。
hset key field1 value1 [field2 value2...]
:保存一个或多个field-value键值对数据
hget key field
:获取
hmset
:批量设置,用法如hset
hmget key field1 [field2 field3...]
:批量获取key中的field1 field2 field3…的值
hgetall xxx
:获取指定哈希表中所有的field和value
hdel key field1 [field2 field3...]
:从指定哈希表中删除一个或多个field
hlen key
:获取指定哈希表中所有的field个数
hexists key field
:判断指定域在指定哈希表是否存在
hkeys key
:获取指定哈希表中所有的field的列表
hvals key
:获取指定哈希表中所有的value列表
hincrby key field num
:对指定哈希表中指定的field值进行加num整数运算
hincrbyfloat key field num
:对指定哈希表中指定的field值进行加num浮点数运算
hsetnx
:同hset,如有则放弃设置
5.6 zset集合类型数据的操作命令
需要对数据根据某个权重进行排序的场景。比如在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息(可以理解为按消息维度的消息排行榜)等信息。
与set一样都是string类型元素的集合,不允许重复,但是不同的是,zset的每个元素都会关联一个分数,redis通过分数对集合中的元素进行从小到大的排序
zadd key score member [score member...]
:将一个或多个member及其score值加入有序集合,如果已经存在则把分数覆盖
zrange key startIndex endIndex[withscores]
:获取指定有序集合中指定下标区间的元素
zrangebyscore key min max [withscores]
:获取指定有序集合中指定分数区间(闭区间)的元素
zrem key member [member...]
:删除指定有序集合中一个或多个元素
zcard key
:获取指定有序集合中所有元素的个数
zcount key min max
:获取指定有序集合中分数在指定区间内的元素个数
zrank key member
:获取指定有序集合中指定元素的排名(从0开始)
zscore key member
:获取元素的分数
zrevrank key member
:获取指定有序集合中指定元素的排名(从大到小)
6. Redis的配置文件
redis.conf,保存在redis根目录,包括
- port端口
- bind表示ip地址
- tcp-keepalive表示连接保活策略
- loglevel:开发阶段配置debug,上线阶段配置notice或warning
- logfile指定日志文件
- databases数据库实例个数
- requirepass设置访问密码,需要protected-mode=yes,设置后连接需要跟参数-a 密码才行
7. Redis的持久化
- Redis DataBase(RDB):在指定时间间隔内,执行了指定次数的写操作,就会触发一次持久化操作
- Append Only File(AOF):开启 AOF 持久化后每执行一条会更改 Redis 中的数据的命令,Redis 就会将该命令写入硬盘中的 AOF 文件。AOF 文件的保存位置和 RDB 文件的位置相同,都是通过 dir 参数设置的,默认的文件名是 appendonly.aof。
8. Redis的事务
允许把一组redis命令放在一起,通过序列化,一起执行,保证部分原子性
部分原子性:在压入队列的过程报错,则事务不执行,在事务执行过程中报错,其他命令依然执行
multi标记一个事务的开始,exec表示执行一个事务,discard表示清除事务,watch表示监控某值,用在multi前,unwatch表示放弃所有监控
9. Redis消息的发布与订阅
消息的发布者往频道上发消息,订阅了此频道的客户端都能够接收到消息
- subscribe:订阅一个或多个频道
- psubscribe:订阅一个或多个频道,支持通配符
- publish:将消息发布到指定频道
此功能有更好的替代品:activeMQ、RabbitMQ
10. Redis的主从复制
主从复制:主机数据更新后,根据配置和策略,自动同步到从机的master/slave机制,master以写为主,slave以读为主
10.1 一主二从
原理:
- 配从不配主
- 配从:slaveof 主ip 主端口
- 主写从读、读写分离
- 从连前后同
- 主断从待命、从断重新连
10.1.1 使用一个redis模拟三台redis服务
- 准备三份redis配置文件:在redis配置文件目录下复制三份配置文件,分别为redis6379、redis6380、redis6381
- 修改配置文件中的port、pidfile、logfile、dbfilename
- 分别使用三个配置文件启动三个redis服务:redis-server redis6379.conf &
10.1.2 查看三台redis服务在集群中的主从角色
- 通过客户端连接服务
- 查看角色:info replication
- 配从不配主:slaveof 127.0.0.1 6379,此时数据已自动同步,称作全量复制。配置完成后,从库只能读不能写
- 增量复制:在主库写数据时,从库自动同步获得,称作增量复制
- 主机宕机,从机待命,仍可读。主机恢复,从机自动重连
- 从机宕机后恢复,需要重新连接主机,设置自己的从库属性
- 从机变主机:先让从机断开从属关系:slaveof no one,再重新设置从属关系,让其他的从机从属于新的主机。主机恢复后设置其变从机。
10.2 哨兵模式
- 用touch创建一个哨兵模式的配置文件:在redis安装目录中创建redis_sentinel.conf,放弃使用原有的哨兵配置文件。
- 更改配置文件的内容,提供主机的ip、端口号、需要的投票数:sentinel monitor dc-redis 127.0.0.1 6379 1
- 通过启动哨兵服务:redis-sentinel redis_sentinel.conf
- 主机宕机后,哨兵根据投票数选择某一从机上位
- 主机恢复后,哨兵将其自动变为从机,从属于新的主机