redis 常用指令

312 阅读8分钟

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在1020的所有数据
    
zcount key scoreind endind //根据分数区间获取数据的数量
    如zcount zsetone 10 20,获取分数在1020的数据数量
    
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 的一些指令用法,可能存在不足或错误,如有发现请指出来。