在学习redis命令前,先了解一下以下redis的特性,
- redis是非关系型数据库,它可以存储key和5种不同类型的值之间的映射;
- redis的命令不区分大小写,但数据的key是区分大小写的,redis中的所有操作全是原子操作,它整个架构被实现成单线程;
- redis的数据类型不支持数据类型嵌套,基本全是字符串,比如集合类型的元素不能是另一个集合或是散列表等;
- 在redis中每个key都属于一个明确的数据类型,如通过hset建立的是散列类型,set建立的是字符串类型,如果使用一种数据类型的命令操作另一种数据类型的key会提示错误:”ERR Operation againset a key holding the wrong kind of value”;
以下所有操作可以在GUI工具或是redis-cli交互终端中执行,交互终端进入方式,需要先进入到/usr/local/Cellar/redis/6.2.6/bin目录下:
//本地连接
./redis-cli
//退出连接,可在交互窗口中直接输入exit
127.0.0.1:6379>exit
//远程连接,命令格式【./redis-cli -h IP -p PORT】 ,比如:
./redis-cli -h 127.0.0.1 -p 6379
节点操作
连接命令
- quit:关闭连接(connection)
- auth:简单密码认证
- ping:回复为PONG正常
- help cmd: 查看cmd帮助,例如:help quit
- select index:选择数据库,从0开始,默认为16个数据库
- info:它有大量的参数用于检查redis服务器的状态
持久化命令
- save:将数据同步保存到磁盘RDB文件中,备份未完成前会阻塞客户端的请求
- bgsave:将数据异步保存到磁盘RDB文件中,复制一个新进程来备份数据
- lastsave:返回上次成功将数据保存到磁盘的Unix时戳
- shundown:将数据同步保存到磁盘,然后关闭服务
- bgrewriteaof:执行AOF重写
- slowlog get:得到当前耗时命令日志内容,可通过配置来修改slowlgo策略,每条日志由日志ID,执行的LINUX时间,耗时单位(微秒),命令及参数4部分组成。
远程服务控制
- info:提供服务器的信息和统计
- monitor:实时转储收到的请求
- slaveof ip port:把当前数据库变为某个数据库的从数据库
- slaveof no one:把当前从数据库变为主数据库
- config:在运行时配置Redis服务器
通用命令
过期时间
- expire:设定一个key的活动时间(s),超出活动时间此key将丢弃,可用来做优惠活动、验证码等,返回1表示设置成功,0表示失败,当使用set或getset命令为key重新赋值时也会取消这个时间
- ttl:获得一个key的活动时间,-1表示永久生存,-2表示key不存在
- pexpire:作用同expire,区别在于它的值为一个时间点unix时间戳
- pttl:查看还有多少ms过期
- persist key:取消生存时间限制,用set或gestate命令重新赋值时也会取消生存时间限制,但incr, lpush, hset, zrem不会影响
- expireat:作用同expire, 区别在于它的值为一个时间点unix时间戳
- pexpireat:将一个ms级的unix时间戳设置为给定KEY的过期时间
对value操作的命令
- exists(key):确认一个key是否存在,返回0或1
- del(key):删除一或多个key,del命令不支持通配符,可以结合xargs命令自己实现,redis-cli keys “user:*” | xarges reds-cli del //删除所有以user:开头的键,这个命令需要在普通的命令提示符下运行,redid-cli del ‘redis-cli keys “user:*”’这条命令的性能更好
- type(key):返回值的类型,string, list, hash, set, zset(有序集合)
- keys(pattern):返回满足给定pattern的所有key,可选通配符?*[]\,此命令会遍历所有key,所以不建议在生产环境中使用
- randomkey:随机返回key空间的一个
- keyrename(oldname, newname):重命名key
- dbsize:返回当前数据库中key的数目
- select(index):按索引查询
- move(key, dbindex):移动当前数据库中的key到dbindex数据库
- flushdb:删除当前选择数据库中的所有key
- flushall:删除所有数据库中的所有key
- incr key:自增主键,key可以为一个变量,当set值其值为1,用incr时其值+1
- incrby key count:指定键增加的数值
- decr key:自减主键key的值减少1
- decrby key count:key的值减少指定的count数量
- incrbyfloat key count:双精度浮点数自增
类型操作
String基础类型
在redis中String可以存储string, int, float三种数据类型。
- set(key, value):给数据库中名称为key的string赋予值value,redis对键并没有要求,比较好的实践是用 资源名称:对象ID:对象属性 来命名一个键,比如user:1:friends来存储ID为1的用户的好友列表,但这种结构最好用hash来实现,否则不能保证其原子性,并不建议把整个数据序列化后存储为一个KEY中,这样会造成资源的浪费
- strlen key:返回值的长度,一个汉字占3个字节,因为redis中接收的是UTF-8编码的中文
- get(key):返回数据库中名称为key的string的value,当key不存在时返回nil
- getset(key, value):给名称为key的string赋予上一次的value
- mget(key1, key2,…, key N):返回库中多个string的value
- setnx(key, value):添加string,名称为key,值为value
- setex(key, time, value):向库中添加string,设定过期时间time
- mset(key N, value N):批量设置多个string的值
- msetnx(key N, value N):如果所有名称为key i的string都不存在
- incr(key):名称为key的string增1操作,如果key不存在或值为空串当作0来处理
- incrby(key, integer):名称为key的string增加integer
- decr(key):名称为key的string减1操作
- decrby(key, integer):名称为key的string减少integer
- append(key, value):名称为key的string的值附加value,向已存在key的值后面追加一段字符串
- getrange(key, start, end):返回名称为key的string的value的子串
- getbit key index:二进制操作,一个字节由8个二进制组成,比如key值为bar由24个0和1组成,getbit key 0,就取到的是0
- setbit key index value:二进制操作,把此index的0或1用新值代替,比如stet key 7 1,则bar就变成了aar
- bitcount key:获取二进制字符串中1的个数,加上参数则相当于长度限制,bit count key 0 1,统计前两个字节中1的个数
- bigtop operation destkey key [key…]:多个值按operation进行二进制操作,值存储在desktop中,operation可选值有and, or, xor, not
List列表
可以存储一个有序的字符串列表。向列表两端加入元素,或者获得列表的某一个片段,也可以做为队列使用,分页等,链表上的每个节点都包含了一个字符串。
- rpush(key, value):在名称为key的list尾添加一个值为value的元素
- lpush(key, value):在名称为key的list头添加一个值为value的 元素
- llen(key):返回名称为key的list的长度
- lpop(key):返回并删除名称为key的list中的首元素
- rpop(key):返回并删除名称为key的list中的尾元素
- lindex(key, index):返回index位置的元素,它和下面的let中的Index同样支持大于小于0的操作
- list(key index value):将索引为index的元素赋值为value
- lset(key, index, value):给名称为key的list中index位置的元素赋值
- lrange(key, start, end):返回名称为key的list中start至end之间的元素,从左开始数,查询操作。如果为负数,比如orange key -2 -1,表示取key的最后两个元素
- ltrim(key, start, end):截取名称为key的list,和lrem正好是个相反的操作,配合push等可以保证某个表中只保留最新的多少条记录
- lrem(key, count, value):删除count个值为value的元素并返回,当count>0时从左数,当<0时从右数,当=0时是整个列表(删除整个队列中值为value的元素)
- insert key before|after pivot value:首先从左开始查找值为pivot的元素,然后根据第二个参数来决定将value插入到此元素的前还是后面
- 下面4个命令是阻塞方式
- blpop(key1, key2,… key N, timeout):lpop命令的block版本或在timeout秒内阻塞并等待可弹出的元素出现。
- brpop(key1, key2,… key N, timeout):rpop的block版本或在timeout秒内阻塞并等待可弹出的元素出现。
- rpoplpush(srckey, dstkey):将元素从一个列表转到另一个列表,返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部
- brpoplpush(srckey, dstkey, timeout):将元素从一个列表转到另一个列表,返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部,如果srckey为空,那么在timeout秒内阻塞并等待可弹出的元素出现
Set集合类型
无序集合,它的内部是使用值为空的hash来实现的,方便的地方可以做并、交、差集运算
- sadd(key, member):向名称为key的set中添加元素member,返回添加的数量
- srem(key, member):删除名称为key的set中的元素member
- smembers(key) :返回名称为key的set的所有元素
- spop(key) :随机返回并删除名称为key的set中一个元素
- smove(srckey, dstkey, member) :移到集合元素,成功返回1,否则返回0
- scard(key) :集合中的元素个数
- sismember(key, member) :在key中是否存在member元素
- sinter(key1, key2,…key N):求交集
- sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合
- sunion(key1, (keys)) :求并集
- sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合
- sdiff(key1, (keys)) :求差集,注意key的顺序不同结果也不同
- sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合
- srandmember(key) num:随机返回set的num元素,当num大于集合的大小时全部返回,当>0时返回num个不重复的元素,当<0时有可能返回重复的num个元素
SortSet有集集合
它和sort的最大区别是不支持集合操作,另一方面和hash很类似,它为每个值提供了score。提供了字符串成员与浮点数分值之间的有序映射,元素的排列顺序由分值的大小决定。所以一般应用是是将数据转换为整数并搭配这里的score功能。这样可以简化对特定元素的范围查找。比如IP查找城市功能,就是在set里记录IP起始值的IP,然后分段查找小于等于输入的值,再取这里最大的值或直接用zrangebyscore命令。
- zadd key score member:添加一个元素和此F1关心人分数,如果分数存在则会替换,比如记录分数add scores 89 tom 67 peter 100 david,其中分数可以是Int也可以是float,+inf和-inf表示正负无穷
- zscore key member:获得元素的分数
- zrange key start stop [withscores]:从小到大查找范围分数内的元素,如果需要同时获得分数,可以在外面加上”withscores”,如果stop=-1,表示查询start和最后一个元素,一会返回两个元素
- zrevrange key start top [withscores]:和上面不同的是它是从大到小查询的
- zrangebyscore key min max [withscores] [limit offset count]:获得指定分数范围的元素,比如80 100,表示100>=score>=80,如果80 (100表示不包括100,同样支持+inf和-inf。limit同mysql的用法一样,从结果集offset开始的count个元素。
- zincrby key increment member:增加某个元素的分数
- zcard key:集合中的元素个数
- zcount key min max:获得指定分数范围内的元素个数
- zrem key member:删除一个或多个元素
- zremrangebyrank key min max:按排名范围删除元素,其实就是按照索引顺序删除元素
- zremrangebyscore key min max:按分数范围删除元素
- zrank key member:从小到大获得元素的排名
- zrevrank key member:从大到小获得元素的排名
- zinterstore destination numkeys key [key…] [weights weight [weight…]] [aggregate sum|min|max]:计算集合的交集,并将结果存放在destination中。destination中元素的分数由aggregate来决定。zadd s1 1 a 2 b,zadd s2 10 a 20 b,则zinterstore snew 2 s1 s2> a 11 b 22, zinterstore snew 2 s1 s2 aggregate min> a 1 b 2, max时> a 10 b 20,weights表示不同集合的权重,需要相乘
- zunionstore destination numkeys key [key…] [weights weight [weight…]] [aggregate sum|min|max]:计算集合的并集
Hash散列
一般用于存储二维数据,可以看作关系数据库中行或文档数据库中的文档。
- hset(key, field, value):向名称为key的hash中添加元素field,它不区分插入和更新操作,当为插入时返回1,更新时返回0
- hget(key, field):返回名称为key的hash中field对应的value
- hmget(key, (fields)):返回名称为key的hash中field对应的value,hmget car price color
- hmset(key, (fields)):向名称为key的hash中添加元素多个field,hmset car price 500 color red
- hgetall key:返回key中的所有域的值
- hincrby(key, field, integer):将名称为key的hash中field的value增加integer,是在原基础上,如果此key不存在则会默认创建
- hincrbyfloat(key, field, integer):将名称为key的hash中field的value增加float
- hexists(key, field):名称为key的hash中是否存在键为field的域
- hsetnx key field value:当字段不存在时赋值,如果字段存在则不进行操作
- hdel(key, field):删除一或多个名称为key的hash中键为field的域
- hlen(key):返回名称为key的hash中元素个数
- hkeys(key):返回名称为key的hash中所有键
- hvals(key):返回名称为key的hash中所有键对应的value
- hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value
高级命令
发布与订阅
redis提供了5个与发布和订阅相关的命令,这东西也可以用于服务发现等功能。采用redis提供的5个简单命令可以实现简单的功能,但它本身存在以下问题:1、与redis的稳定性有关,如果一个client读取信息不够快的话,不断积压的消息会使内存越来越大。2、与redis的可靠性有关,如果中间断线,那么client将丢失在断线期间发送的所有消息。
- subscribe(channel...channelN):订阅给定的一个或多个频道,一旦进入这种状态后只能使用subscribe/unsubscribe/psubscribe/punsubscribe这四个命令中的某一个
- unsubscribe(channel...channelN):取消订阅给定的一个或多个频道,如果没有参数则退订所有的频道
- publish(channel, message):向给定频道发送消息,返回值是接收此消息的订阅者的数量,这个消息是实时的,不会被缓存。如果没有收到此消息就丢失了
- psubscribe(pattern...patternN):订阅与给定模式相匹配的所有频道
- punsubscribe(pattern...patternN):取消订阅与给定模式相匹配的所有频道,如果没有参数则退订所有的频道
事务与锁
它是由一组命令组成的,由multi开始,以exec结束,并且建议同时使用watch和unwatch命令。这是一个阻塞操作,它会阻塞同一客户端发送过来的命令。后续发送的命令会被缓存起来。它的好处是减少连接次数。这三个命令构成了一个乐观锁。基本事务:需要用到multi和exec命令,可以让一个客户端在不被打断的情况下执行多个命令,多个命令会按序执行,redis会把多个命令加入到一个队列里,直到客户端发送exec为止。注意这种实现最好是把命令打包发送,减少交互的过程时间。但在java里好像没有类似的类库。
- multi:开启一个事务
- exec:提交事务,会取消对所有key的watch,一般来说事务执行失败后需要重试
- watch key:监视即将执行事务中的key是否发生变化,如果发生了写的变化,事务将执行失败,因为事务是先缓存命令,一起提交的,此命令可以在multi前也可以在后面但必须在exec前面,这个命令可以看成一个乐观锁,如果失改了自己重试即可;
- unwatch key:取消对某个值的监控
- discard:撤消watch命令并清空所有已入队命令,