Redis
Redis配置
启动Redis
redis-server &
根据配置文件启动Redis
redis-server redis.conf &
- 注意:如果修改了redis的配置文件redis.conf,必须在启动时指定配置文件,否则修改无效!
关闭Redis服务
redis-cli shutdown
redis-cli -h 192.168.163.131 -p 6379 shutdown
redis-cli -h 192.168.163.131 -p 6379 -a 123456 shutdown
进入Redis客户端
redis-cli
redis-cli -h 127.0.0.1 -p 6379
redis-cli -h 127.0.0.1 -p 6379 -a 123456
退出Reids客户端
exit或者quit
测试Redis性能
redis-benchmark
- 在bin目录中测试
Redis常用命令
查看状态
redis >ping 返回PONG
- 在redis客户端中执行
- 返回pong表示服务器运行正常
查看Redis服务器的统计信息
info [section]
- section的值:server , clients ,memory等等。不加section 返回全部统计信息
切换Redis库命令
select index
- index为0-999的序号
查看当前数据库中key的数目
dbsize
清空当前数据库
flushdb
清空所有数据库(不常用)
flushall
获得Redis的所有配置值
config get parameter
*
获得所有配置值databases
获取数据库个数port
获取端口号
查看当前数据库中有哪些key
keys [通配符]
*
表示0个或多个字符(单独一个*表示所有)?
匹配随意一个字符[]
匹配中括号里面的一个字符
判断key在数据库中是否存在
exists key
- 存在返回1,不存在返回0
可以判断多个key是否存在,若存在几个返回几
例如:exists a b c d
--> 都存在返回4
移动一个数据库中的数据到其他数据库中(使用较少)
move key index
- index为数据库的序号
剩余生存时间
ttl key
-->(time to live的简称) 查看剩余生存时间- 返回值为-2表示当前库不存在
- 返回值为-1表示一直存在
设置生存时间
expire key sceonds
查看key的数据类型
type key
key的重命名
只修改key的名称不修改值
rename key1 key2
- key1:原名称
- key2:修改后的名称
删除指定的key
del key [key......]
- 返回值实际删除key的数量
String类型数据的操作命令
将String类型的数据设置到redis中
set 键 值
- 如果key已经存在了,那么就会覆盖
获取String类型数据的值
get key
追加字符串
append key value
- 返回追加之后字符串的长度
- 如果key不存在,则新创建一个key,并且把value设置为value
获取字符串的长度
strlen key
将字符串数值进行加一运算
incr key
- 返回加1之后的数据
- 如果key不存在,首先设置一个key,值初始化为0,然后进行incr运算
- 要求key所表示必须是数值,否则报错。
将字符串数值进行减一运算
decr key
- 返回减1之后的数据
- 如果key不存在,首先设置一个key,值初始化为0,然后进行incr运算
- 要求key所表示必须是数值,否则报错。
将字符串数值进行加offset运算
incrby key offset
- 返回加offset运算之后的数据
- 如果key不存在,首先设置一个key,值初始化为0,然后进行incrby运算
- 要求key所表示必须是数值,否则报错。
将字符串数值进行减offset运算
decrby key offset
- 返回减offset运算之后的数据
- 如果key不存在,首先设置一个key,值初始化为0,然后进行decrby运算
- 要求key所表示必须是数值,否则报错。
获取字符串key中从startIndex到endIndex的字符组成的子字符串:
getrange key startIndex endIndex
- 前后都是闭区间
- 下标从右到左:0 到 length-1
- 下标从右到做:-length 到 -1
修改字符串key中从startIndex字符组成子字符串
setrange key startIndex value
- 能覆盖几个字符就覆盖几个字符
设置字符串的同时,设置它最大生命周期
setex k1 20 v1
设置String类型的数据value到Redis数据库中,当key不存在时设置成功,否则,则放弃设置
setnx key value
批量将String类型的数据设置到redis中
mset 键1 值1 键2 值2....
批量从Redis中获取String类型的数据
mget 键1 键2 键3....
批量设置String类型的数据value到redis数据库中,当所有key都不存在时设置成功,否则(只要有一个以及存在),则全部放弃
msetnx 键1 值1 键2 值2
list类型的数据
将一个或多个值依次插入到列表的表头(左侧)
lpush key value[value value.....]
获取指定列表中的下标区间的元素
lrange key startIndex endIndex
- 前后都是闭区间
将一个或多个值依次插入到列表的表尾(右侧)
rpush key value[value value.....]
从指定列表中移除并且反回表头元素
lpop key
从指定列表中移除并且反回表尾元素
rpop key
获取指定列表中指定下标的元素
lindex key index
获取指定列表的长度
llen key
根据count值移除指定列表中跟value相等的数据
lrem key count value
- 返回结果为删除的值得个数
- count大于0从列表的左侧移除count个跟value相等的数据
- count小于0从列表的右侧移除count个跟value相等的数据
- count等于0从列表中移除所有跟value相等的数据
截取指定列表中指定下标区间的元素组成新的列表,并且赋值给key
ltrim key startIndex endIndex
将指定列表中指定下标的元素设置为指定值
lset key index value
将value插入到指定列表中位于pivot元素之前/之后的位置
linsert key before/after pivot value
- 命令执行成功,返回新列表的长度
- 没有找到pivot返回 -1
- key不存在返回0
set集合
- 单key-多无序value
- 没有下标
- 一个key对应多个vlaue;
- value之间没有顺序,并且不能重复;
- 通过业务数据直接操作集合。
将一个或者多个元素添加到指定的集合中
sadd key value [value value ....]
- 如果元素已经存在,则会忽略,元素之间不能重复
- 返回成功加入的元素的个数
获取指定集合中所有的元素
smembers key
判断指定元素在指定集合中是否存在
sismember key member
- 存在,返回1
- 不存在,返回0
获取指定集合的长度
scard key
移除指定集合中一个或者多个元素
srem key member [member .....]
- 不存在的元素会被忽略
- 返回成功成功移除的个数
随机获取指定集合中的一个或者多个元素
srandmember key [count]
- count:随机产生几个数据
- |->count>0:随机获取的多个元素之间不能重复
|->count<0: 随机获取的多个元素之间可能重复
从指定集合中随机移除一个或者多个元素
- spop key [count]
- 返回随机移除元素的值
将指定集合中的指定元素移动到另一个元素
smove source dest member
- source:移动之前的集合
- dest:移动之后的集合
- member:移动的值
-----------------------------------------------------------
集合中都有以下三个命令
获取第一个集合中有、但是其它集合中都没有的元素组成的新集合(差)
sdiff key key [key key ....]
获取所有指定集合中都有的元素组成的新集合(交)
sinter key key [key key ....]
获取所有指定集合中所有元素组成的大集合(并)
sunion key key [key key .....]
hash类型数据
单key:field-value
field-value
…
将一个或者多个field-vlaue对设置到哈希表中
hset key filed1 value1 [field2 value2 ....]
- key:数据标识
- field:域
- value:值
- 如果key field已经存在,把value会把以前的值覆盖掉
获取指定哈希表中指定field的值
hget key field
批量将多个field-value对设置到哈希表中
- 不常用,常用
hset
命令 hmset key filed1 value1 [field2 value2 ....]
批量获取指定哈希表中的field的值
hmget key field1 [field2 field3 ....]
获取指定哈希表中所有的field和value
hgetall key
从指定哈希表中删除一个或者多个field
hdel key field1 [field2 field3 ....]
获取指定哈希表中所有的filed个数
hlen key
判断指定哈希表中是否存在某一个field
hexists key field
- 存在返回1
- 不存在返回0
获取指定哈希表中所有的field列表
hkeys key
获取指定哈希表中所有的value列表
hvals key
对指定哈希表中指定field值进行整数加法运算
hincrby key field int
对指定哈希表中指定field值进行浮点数加法运算
hincrbyfloat key field float
将一个field-vlaue对设置到哈希表中,当key-field已经存在时,则放弃设置
hsetnx key field value
zset集合
- 有序集合
- 本质上是集合,所有元素不能重复;
- 每一个元素都关联一个分数,redis会根据分数对元素进行自动排序(默认从小到大的排序)
- 分数可以重复,但是集合中的元素不能重复
- 既然有序集合中每一个元素都有顺序,那么也都有下标;
- 有序集合中元素的排序规则又列表中元素的排序规则不一样。
将一个或者多个member及其score值加入有序集合
zadd key score member [score member ....]
- 如果元素已经存在,则把分数覆盖
获取指定有序集合中指定下标区间的元素
zrange key startIndex endIndex [withscores]
- 升序排序,从小到大,闭区间
- withscores:会把分数一起显示出来
获取指定有序集合中指定下标区间的元素
zrevrange key startIndex endIndex [withscores]
- 降序排序,从大到小,闭区间
- 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
- 降序排名,按照分数从大到小的排名
redis配置文件
- 在redis根目录下提供redis.conf配置文件
- 使用配置文件时,要进入到redis目录中,因为是相对路径。
网络的配置
- port:指定redis服务所使用的端口,默认使用6379。
- bind: 配置客户端连接redis服务时,所能使用的ip地址,默认可以使用redis服务所在主机上任何一个ip都可以;一般情况下,都会配置一个ip,而且通常是一个真实。
- 如果配置了port和bind,则客户端连接redis服务时,必须指定端口和ip:
redis-cli -h 192.168.11.128 -p 6380
进入客户端
redis-cli -h 192.168.11.128 -p 6380 shutdown
退出客户端
tcp-keepalive
:连接保活策略。
常规配置:
- loglevel:配置日志级别,开发阶段配置debug,上线阶段配置notice或者warning.
- logfile:指定日志文件。redis在运行过程中,会输出一些日志信息;默认情况下,这些日志信息会输出到控制台;我们可以使用logfile配置日志文件,使redis把日志信息输出到指定文件中。
- databases:配置redis服务默认创建的数据库实例个数,默认值是16。
安全配置:
- requirepass:设置访问redis服务时所使用的密码;默认不使用。
- 此参数必须在protected-mode=yes时才起作用。
- 一旦设置了密码验证,客户端连接redis服务时,必须使用密码连接:
redis-cli -h ip -p port -a pwd
redis的持久化
redis提供持久化策略,在适当的时机采用适当手段把内存中的数据持久化到磁盘中,每次redis服务启动时,都可以把磁盘上的数据再次加载内存中使用。
RDB策略
- RDB策略:在指定时间间隔内,redis服务执行指定次数的写操作,会自动触发一次持久化操作。
- RDB策略是redis默认的持久化策略,redis服务开启时这种持久化策略就已经默认开启了。
save <seconds> <changes>
:配置持久化策略- dbfilename:配置redis RDB持久化数据存储的文件
- dir: 配置redis RDB持久化文件所在目录
AOF策略
- AOF策略:采用操作日志来记录进行每一次写操作,每次redis服务启动时,都会重新执行一遍操作日志中的指令。
- 效率低下,redis默认不开启AOF功能。
指令
- appendonly:配置是否开启AOF策略
- appendfilename:配置操作日志文件
redis事务
- 把一组数据库命令放在一起执行,保证操作原子性,要么同时成功,要么同时失败。
- redis的事务:允许把一组redis命令放在一起,把所有命令进行序列化,然后一起执行,保证部分原子性
- 在事务执行中,不会被其他客户端发来的命令打断(除非使用watch命令监控某些键)
- redis不保证事务的原子性,同一个事务中如果一条命令执行失败,其他命令仍可能会被执行,redis事务没有回滚,
- redis已经在系统内部进行功能简化,这样可以保证更快的运行速度,因为redis不需要事务回滚能力
命令
- multi:用来标记一个事务的开始。
- exec:用来执行事务队列中所有的命令。
- discard:清除所有已经压入队列中的命令,并且结束整个事务。
- watch:监控某一个键,当事务在执行过程中,此键代码的值发生变化,则本事务放弃执行;否则,正常执行。
- unwatch:放弃监控所有的键。
redis的事务只能保证部分原子性:
- 如果一组命令中,有在压入事务队列过程中发生错误的命令,则本事务中所有的命令都不执行,能够保证事务的原子性。
- 如果一组命令中,在压入队列过程中正常,但是在执行事务队列命令时发生了错误,则只会影响发生错误的命令,不会影响其它命令的执行,不能够保证事务的原子性。
redis如何监控银行财务
- 先定义一个version的乐观锁
- 每次修改表中数据时候,先查出version的乐观锁的值
- 修改数据后,将乐观锁进行+1运算
- 如果version字段在事务执行过程中数值进行了变化,则放弃事务的修改
- 通常在事务开启时,用
watch
监听version - 如果version 发生了变化,此次事务就会失败
redis集群
- redis的主从复制:主少从多、主写从读、读写分离、主写同步复制到从。
- 一台主机配置多台从机,一台从机又可以配置多台从机,从而形成一个庞大的集群架构。
减轻一台主机的压力,但是增加了服务间的延迟时间。
指令
slaveof 127.0.0.1 6379
设置为从库slaveof no one
取消从库,设置为主库
搭建一主二从redis集群
搭建三台redis服务:使用一个redis模拟三台redis服务
- 提供三分redis配置文件:redis6379.conf、redis6380.conf、redis6381.conf
- 修改三份配置文件:以redis6379.conf为例
bind 127.0.0.1 ip地址
port 6379 端口号
pidfile /var/run/redis_6379.pid
logfile “6379.log” 日志文件
dbfilename dump6379.rdb 持久化文件 - 分别使用三个redis配置文件,启动三个redis服务:
redis-server redis6379.conf &
redis-server redis6380.conf &
redis-server redis6381.conf &
通过redis客户端分别连接三台redis服务:
redis-cli -h 127.0.0.1 -p 6379
redis-cli -h 127.0.0.1 -p 6380
redis-cli -h 127.0.0.1 -p 6381
查看三台redis服务在集群中的主从角色:
- info replication 查看redis服务主从信息
- 默认情况下,所有的redis服务都是主机,即都能写和读,但是都还没有从机。
先在6379进行写操作:
- set k1 v1
- 三台rdis服务互相独立,互不影响。
设置主从关系:设从不设主
- 在6380上执行:slaveof 127.0.0.1 6379
- 在6381上执行:slaveof 127.0.0.1 6379
全量复制:一旦主从关系确定,会自动把主库上已有的数据同步复制到从库。
- 在6380和6381上执行:keys *
增量复制:主库写数据会自动同步到从库。
- 在6379上执行:set k2 v2
- 在6380和6381上执行:keys *
主写从读,读写分离:
- 在6380和6381上执行:set k3 v3 ===>报错
- 从机上只能读取数据,不能修改数据
主机宕机、从机原地待命:
- 关闭6379服务:redis-cli -h 127.0.0.1 -p 6379 shutdown
- 查看6380和6381服务的主从角色:info replication
主机恢复、一切恢复正常:
- 重启6379服务:redis-server redis6379.conf &
- 客户端连接6379:redis-cli -h 127.0.0.1 -p 6379
从机宕机、主机少一个从机、其它从机不变:
- 关闭6380服务: redis-cli -h 127.0.0.1 -p 6380 shutdown
- 查看6379服务的主从角色:info replication
- 查看6381服务的主从角色:info replication
从机恢复、需要重新设置主从关系:
- 重启6380服务:redis-server redis6380.conf &
- 客户端连接6380:redis-cli -h 127.0.0.1 -p 6380
- 在6380上执行: slaveof 127.0.0.1 6379
从机上位:
- 主机宕机、从机原地待命:
关闭6379服务:redis-cli -h 127.0.0.1 -p 6379 shutdown
查看6380和6381服务的主从角色:info replication - 从机断开原来主从关系:
在6380上执行:slaveof no one
查看6380服务的主从角色:info replication - 重新设置主从关系:
在6381上执行:slaveof 127.0.0.1 6380 - 之前主机恢复、变成孤家寡人:
重启6379服务:redis-server redis6379.conf &
客户端连接6379:redis-cli -h 127.0.0.1 -p 6379 - 天堂变地狱:
在6379上执行:slaveof 127.0.0.1 6381
在6381上执行:info replication 既是主机又是从机
哨兵模式
- 主机宕机、从机上位的自动版。
搭建哨兵模式
搭建一主二从集群架构:(集群搭建前五步)
提供哨兵配置文件:
- 在redis安装目下创建配置文件:redis_sentinel.conf
- 使用vim指令进行写入以下指令
sentinel monitor dc-redis 127.0.0.1 6379 1
启动哨兵服务:
redis-sentinel redis_sentinel.conf
主机宕机:
- 关闭6379服务:redis-cli -h 127.0.0.1 -p 6379 shutdown
- 哨兵程序自动选择从机上位。
之前主机恢复:自动从属于新的主机。
- 重启6379服务:redis-server redis6379.conf &
- 客户端连接6379:redis-cli -h 127.0.0.1 -p 6379
java程序中访问redis
创建maven版的java工程
添加jedis依赖
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
创建Jedis连接
- 关闭linux的防火墙
redis-cli -h ip -p port