redis 是非关系型数据库,与关系型数据库相比最大的区别是存在内存中,存取速度有了极大地提升,redis 是通过 key-value 的方式存储数据,也常用来做缓存。那在 linux 中的 redis 有哪些常见的指令呢?
测试环境: linux:centos7
redis:6.2.6
注:测试只是为了更好地理解指令作用,使用 redis 之前,必须提前安装 redis 数据库。
一、启动与关闭
启动redis服务:
redis-server //启动redis服务
redis-server & //后台启动redis服务,这样 linux 命令窗口可以执行其他指令
redis-server redis.conf & //根据指定配置文件启动服务
关闭redis服务:
kill -9 pid //根据pid来强制关闭服务(不推荐)
redis-cli shutdown //关闭redis服务
redis-cli -h ip地址 -p 端口 shutdown //关闭redis服务
注:如果使用配置文件启动服务,就需要用 redis-cli -h ip地址 -p 端口 shutdown 指令来关闭服务
开启客户端:
redis-cli //启动客户端
redis-cli -h ip地址 -p 端口 //启动客户端
注:如果使用配置文件启动服务,就需要用 redis-cli -h ip地址 -p 端口 指令来开启客户端
退出客户端:
exit 、quit
二、key 操作
keys * //查看所有key
keys k* //查看所有k开头的key值
keys h*k //查看h开头,k结尾的key
keys h?k //查看h开头,k结尾,中间只有一个参数的key
keys h[abcd]llo //查看h开头,llo结尾,并且中间存在某个指定值的key
exists key //判断key值为h在数据中心是否存在,存在为1,不存在为0
ttl key //查看key值生存时间,默认-1,没有限制
expire key seconds //设置key最大生存时间
type key //查看key数据类型
rename key newkey //重命名key值
del key //删除指定key
三、string 数据
添加数据
set key value //添加数据,如set id 1:添加一条数据,key值为id,value为1
注:使用set指令,如果已经存在key值,则会替代原value值
append key 追加值 //在原有数据上追加值,如append id 1:返回结果为11
注:使用append如果数据存在一个非数字类型,则回进行字符串拼接
setex key seconds value //添加数据,并且设置生存时间
如:setex id 20 1:设置value为1的id,并且只能存在20秒,然后就销毁
setnx key value //当数据库中不存在这个key的时候才能添加数据(相比set指令,安全性更高)
mset key1 value1 key2 value2 key3 value3 .... //批量添加多个数据,类似于set指令
msetnx key1 value1 key2 value2 .... //批量添加数据,不能有一个key是已经存在的,类似于mset指令
查询数据
get key //查询key值对应的数据
strlen key //根据key值查询数据长度,如strlen id,返回1
mget key1 key2 ... //一次性查询多个数据,类似get
更新数据
incr key //将指定key值的数值+1,如incr id ,将key为id的值+1
注:incr key中需要值为数值的key,否知报错;返回结果为value值;如果key不存在,值会创建一个,并且赋值为0再计算
dect key //将指定key值的数值-1,如decr id ,将key为id的值-1
注:dect key中需要值为数值的key,否知报错;返回结果为value值;如果key不存在,值会创建一个,并且赋值为0再计算
incrby key n //将指定key值的数值+n,如incrby phone 10,将key为phone的值+10
注:incrby key n 中需要值为数值的key,否知报错;返回结果为value值;如果key不存在,值会创建一个,并且赋值为0再计算
getrange key startInd endInd //截取字符串
如getrange phone 0 2,截取的字符为136并且返回(phone为136900*****),不会改数据库内容
setrange key startInd value //修改字符串
如setrange phone 1 222,结果为122200*****,会改变数据库内容
四、list 数据
参考数据:listone:0 1 2 3
添加数据
lpush key value1 value2 ... //添加list数据(左)
如:lpush list 1 2 3 ,注:value值可以一个或者多个,存放的顺序默认是 3-2-1
rpush key value1 value2 value3 ... //添加list数据(右)
如:rpush list 1 2 3 ,注:value值可以一个或者多个,存放的顺序默认是 1-2-3
删除数据
lpop key //移除表头数据,
如lpop listone ,返回的结果是删除的元素,数据变为 1 2 3
rpop listone //移除表尾数据,
如rpop listone ,返回的结果是删除的元素,数据变为 0 1 2
lrem key count value //移除某个位置多个数据,
如lrem listone 2 a ,表示删除listone中数据为a的元素,从左到右共两个。注:如果是-2,则是从右到左
查询数据
lrange key startInd stopInd //读取list数据
如:lpush list 1 2 3 ,lrange list 1 2,读取的数据是2,1。
lindex key index //查询指定下标的数据: lindex key index ,如lindex listone 1 ,结果1,注:listone元素为 0 1 2 3
llen key //返回list数组长度: llen key ,如llen listone
更新数据
ltrim key strapInd endInd //截取指定位置元素组成一个新的列表
如:ltrim listone 1 3 ,将listone中索引1-3的数据重新组成一个list并且赋给listone
lset key index value //根据下标修改指定位置的值
如:lset listone 1 a,将listone中索引为1的数据改为a
linsetr key before/after index value //在指定索引位置之前,插入数据
如linsetr listone before 1 a
五、set 数据
添加数据
sadd key value1 value2 //添加set数据
如sadd setone 1 2 3,注:如果重复,则只添加一个
删除数据
srem setone 1 2 4 //移除指定的一个或者多个元素
注:如果set中没有对应元素,则会跳过指定那一个,比如4
spop key 或者 spop key count //随机移除一个或者多个元素
查询数据
smembers key //获取set数据元素
如smembers setone ,返回1 2 3
sismember key value //判断元素是否在set中
如sismember setone 1,判断1是否在setone中
scard key //获取set集合长度
srandmember key //随机获取某一个元素
如srandmember setone
注:如果使用 srandmember key count 的话,随机获取count个元素,如果count<0,则可能两个相同
sdiff key1 key2 key3 ... //获取第一个集合中有,但其他集合没有的元素
注:第一个是第一个集合,接下来是其他集合
sinter key1 key2 key3 ... //多个集合共同的元素
sunion key1 key2 key3... //获取所有集合元素的组成
更新数据
smove key1 key2 key1 //将一个集合中的元素移到另外一个集合中
如smove setone settwo a,将setone中的a移除到settwo中
六、hash 数据
添加数据
hset key field1 value1 field2 value2 field3 value3 ... //添加数据
如 hset student Id 1 name yuqn age 21 sex 男
hsetnx key field value //添加对象,如果存在不添加: hsetnx key field value
删除数据
hdel key field1 field2 ... //删除一个或者多个属性
如 hdel student id name
查询数据
hget key field //获取数据
如:hget student id ,返回student对象里面的id值
获取一个对象的多个属性: hmget key field1 field2 ... ,返回一个对象的多个属性值,如 hmget student id name age,返回了id,name,和age值
hgetall key //获取一个对象的全部属性
如:hgetall student
hexists key field //查询对象中是否存在某一个field
如:hexists student id
hkeys key //获取对象所有的key
如hkeys student,获取student对象的所有key,返回id name age sex
hvalue key //获取对象所有的值
如hvalue student,返回 1 yuqn 21 男
更新数据
hincrby key field int //将对象中某一个整数值进行运算
如 :hincrby student id 1,将id+1 并且返回,注:负数为减,field必须是整形
hincrby key field float //将对象中某一个浮点数值进行运算
如 :hincrby student id 0.1,将id+0.1 并且返回,注:负数为减,field必须是浮点形
七、zset 数据
添加数据
zadd key score member //添加数据
如:zadd zsetone 20 数据a 10 数据b 30 数据c ,排序顺序为数据b 数据a 数据c
查询数据
zrange key stortind endind //根据获取数据
注:尾部加上withscores后,可以获取score以及对应对应的member
zrangebyscore key scoreind endind //根据分数区间获取对应数据
如:zrangebyscore zsetone 10 20,获取分数w在10到20的所有数据
zcount key scoreind endind //根据分数区间获取数据的数量
如zcount zsetone 10 20,获取分数在10到20的数据数量
zcard key //获取数据长度
zscore key member //根据元素获取对应分数
如zscore setone 数据1
zrank key member //根据元素获取位置
如zrank setone 数据1 注:从小到大排名,如果从大到小则用zrevrank
八、事务
redis支持事务,但是支持事务的部分原子性,将多条指令存放到队列中,依次执行。
如果添加到队列的指令检测出错误,则保证原子性;如果添加到队列的指令没有被检测出原子性,则执行事务的时候,只执行没有错误的指令,即不能保证原子性
添加事务指令
multi
语句一
语句二
exec
注:注:每一行都要回车,multi--exec中间的语句,是将语句存放到队列中,最后通过exec执行所有语句。
清除事务中的指令
multi
语句一
语句二
discard
exec
注:执行失败,discard将队列中所有的指令都清理掉,discard将队列中所有的指令都清理掉可以在任意语句之后。
添加监听
watch version
multi
语句一
语句二
exec
注:在添加队列之前,监听version(数据库一个值),执行的时候,如果监听的对象被改变,则执行失败
取消监听的所有键
watch version
unwatch version
multi
语句一
语句二
exec
注:unwatch version取消监听的version键
九、持久化策略
redis是存储在内存中,一旦发生意外,数据将丢失,于是redis给出了如下策略
一、RDB策略:
redis在指定时间内达到操作次数就会触发,将内存中的数据存储到磁盘中。
注:可以手动更改redis配置文件save <seconds> <changes>,其中seconds表示时间,changes表示请求次数,如果不需要,可以注释掉
dbfilename:持久化生成数据的文件名,默认dump.rdb
dir:生成配置文件的目录
二、AOF策略:
redis每次将写操作保存在日志中,下次重启后,依次读取日志文件进行回复。这种方法效率低,每次写操作都要访问磁盘
十、主从复制
主从复制能够使redis更好地进行读取操作,主机能够读写操作(一般只用来写),从机只能进行读操作,主机出现宕机之后,数据不会丢失。
以下是模拟三台机器运行场景(一主二从)
一、复制三个redis.conf配置文件,分别修改以下属性:
bind 127.0.0.1
port 6379
pidfile /var/run/redis6379.pid
logfile "6379.log"
dbfilename dump6379.rdb
二、连接
三、查看在集群中的主从角色(默认都是主机,都能读写)
info replication
四、设置主从(设从不设主,即将某一redis设置为另一redis的从机)
slaveof 主机ip 主机redis端口
五、主写从读
主机能写、读(一般不用),从机只能读
六、主机宕机
主机宕机,从机原地代码,还能进行读操作,主机恢复后,一切正常
七、从机宕机
少一个从机,其他不变,恢复后,变成主机
八、从机上位
当主机宕机后如果无法修复,可以将某一个从机设置为主机,并且让其他从机重新绑定主机
1)关闭从机角色:slaveof no one
2)重新绑定其他从机:slaveof 127.0.0.1 6380
十一、哨兵模式
哨兵模式主要是解决宕机情况下,从机转为主机问题,以及主机恢复之后,自动变成从机。
一、提供哨兵配置文件:
在redis目录下创建配置文件:redis_sentinel.conf文件,并且在里面输入内容
sentinel monitor dc-redis 127.0.0.1 6379 1
注:dc-redis表示哨兵名,ip表示主机名字,端口表好似主机端口,1表示投票数,从机先达到票数,则转为主机,由redis算法计算,一般跟服务器性能有关
二、启动哨兵服务:
redis-sentinel redis_sentinel.conf
十二、其他
redis-benchmark //测试redis服务的性能
ping //查看redis服务是否正常运行
如果正常--pong
info //查看redis服务器的统计信息
注:info 查看redis服务的所有统计信息
info [信息段] 查看redis服务器的指定统计信息,如info Replication
select index //切换数据库实例
注:默认16个数据库实例,分别为0-15,如果不指定,默认存储在第0个,
dbsize //查看当前数据库实例中有多少个key
flushdb //清除当前数据库实例
flushall //清除所有数据库实例(慎用)
以上就是 redis 的一些指令用法,可能存在不足或错误,如有发现请指出来。