在前面已经介绍了redis的安装,这里介绍一个redis的基本数据类型
《redis入门指南系列》之linux下安装redis
redis的官方地址:redis,里面有专门的命令介绍
打开redis自带的客户端,redis-cli,输入几个命令来感受一下
获得符合规则的键名列表:比如现在要查找redis中所有的键名
KEYS *
会在终端输出所有的键
或者只想输出包含字母k的键,输入*k*,会输出如下
用过正则表达式的应该知道,pattern就是类似这种匹配规则,更多细节:KEYS
符号 | 含义 | 样例 |
? | 匹配一个字符 | 查找ke开头的键:ke?; 查找k开头的3个字符的键:k?? |
* | 匹配任意个(包括0个)字符 | 上面的KEYS * |
[] | 匹配括号间的任一字符,可以用-表示范围; 还可以用正则表达式的^,$进行限定 |
查找h-j开头的键:[h-j]* 查找所有不以k开头的键:[^k]* |
\ | 用于转义字符 | 查找含有?的键:*\?* |
返回key是否存在:比如判断key是否存在
EXISTS key
会在终端输出结果:1 如果key存在,0 如果key不存在
更多细节:EXISTS
删除指定的一批keys,如果删除中的某些key不存在,则直接忽略:比如删除key
可以同时删除多个key,DEL KEY1 KEY2 ...返回被删除的keys的数量
更多细节:DEL
返回key
所存储的value
的数据结构类型,它可以返回string
, list
, set
, zset
和 hash
等不同的类型。
刚才的key都被删除完了,现在先插入一个key,再看下它的类型
更多细节:TYPE
redis有5种数据类型,分别是
Redis Strings,这是最简单Redis类型,它能存储任何形式的字符串,包括二进制数据。后面4种数据类型的基础都是字符串。
在热身的时候,用type命令查看过一个键name的类型为string
字符串用以下2个命令设置,获取一个键,这是redis中最简单的命令
SET key value
GET key
值可以是任何种类的字符串(包括二进制数据),例如你可以在一个键下保存一副jpeg图片
值的长度不能超过512 MB
虽然字符串能存储任何类型的数据(不像java这种有基本的类型byte,char,short,int,long,float,boolean,double),但是对于整数,还是可以特殊操作:
递增操作
INCR key
INCR的作用是让当前键值递增,并返回递增后的值。如果当前key不存在,则默认为0,递增后为1。
如果当前键不是整数,会提示错误
除了INCR进行递增之外,还可以增加,减少指定的整数:INCRBY key increment,DECRBY key increment
更多细节:INCR
向字符串尾部追加值
APPEND key value
如果 key
已经存在,并且值为字符串,那么这个命令会把 value
追加到原来值(value)的结尾。 如果 key
不存在,那么它将首先创建一个空字符串的key
,再执行追加操作。返回append后字符串值(value)的长度。
更多细节:APPEND
字符串长度
STRLEN key
返回key的string类型value的长度。如果key对应的非string类型,就返回错误。
同时设置/获取多个键值
MSET key value [key value ...]
MGET key [key ...]
MSET:对应给定的keys到他们相应的values上。MSET
会用新的value替换已经存在的value,就像普通的SET命令一样
MGET:返回所有指定的key的value。对于每个不对应string或者不存在的key,都返回特殊值nil
SETNX
上面介绍了SET,MSET重复设置同一个键,都会对原值进行覆盖,但是在有些情况下,却不需要覆盖,所以需要乃至SETNX。
将key
设置值为value
,如果key
不存在,这种情况下等同SET命令。 当key
存在时,什么也不做。SETNX
是”SET if Not eXists”的简写。
这个命令在特殊场景很有用,比如可以用来做分布式锁,后续尝试一下。更多细节:SETNX
Hashes,由field和关联的value组成的map。field和value都是字符串的。类似java在Map,也是键值对
比如下面所有的命令都以这个场景为例:存储一个汽车car及对应的一些属性
ID | color | name | price | date |
1 | 黑色 | 奥迪 | 100W | 2020年6月27日 |
2 | 白色 | 哈弗 | 10W | 2020年6月27日 |
取值与赋值
HSET key field value
HGET key field
把上面的2条记录设置进去,先存入奥迪车信息
批量设置/获取键值
上面那条记录的属性是一个个设置的,其实散列有批量设置的命令
HMSET key field value [field value ...]
HMGET key field [field ...]
用以上命令设置一下哈弗车信息
获取所有散列键值对
HMGET获取car的所有属性都需要指明,如果不知道car有什么键,可以通过HGETALL查看
但是这个命令有些缺憾,就是键值对不很直观
更多细节:HMGET
判断字段是否存在
HEXISTS key field
判断car的name是否存在,存在返回1,否则返回0
HEXISTS
删除字段
HDEL key field [field ...]
删除car的name属性,删除成功返回1,失败为0
更多细节:HDEL
只获取字段名或字段值
HKEYS key
HVALS key
有时仅仅需要字段中所有字段的名字而不需要值,可以使用HKEYS命令
相对应的,可以使用HVALS命令获取所有的字段值
更多细节:HVALS
获取字段数量
HLEN key
获得键的字段个数
按插入顺序排序的字符串元素的集合。他们基本上就是链表(linked lists)。可以类似相像为java中的List集合
常用的操作是向列表两端添加元素,或者获得列表的某一个片段。列表内部使用双向链表,插入/删除元素速度快,但是查找速度慢一些
向列表两端增加元素
LPUSH key value [value ...]
RPUSH key value [value ...]
列表可以从两端插入元素,LPUSH表示从左边插入,RPUSH表示从右边插入。现在往车队velicle中左边插入auid,haval,右边插入BMW
从列表两端弹出元素
LPOP key
RPOP key
从列表中弹出一个元素,返回取出的元素,并且会从列表中删除这一个元素,利用这一特性,列表可以当作队列使用
集合Set,可以类比JAVA中的set。集合中每个元素都是不同的,且没有顺序。
集合和列表相似,但也有不同点,可以对比一下
集合类型 | 列表类型 | |
有序性 | 否 | 是 |
唯一性 | 是 | 否 |
增加/删除元素
SADD key member [member]
SREM key member [member]
SADD,添加一个或多个指定的member元素到集合的 key中.指定的一个或者多个元素member 如果已经在集合key中存在则忽略.如果集合key 不存在,则新建集合key,并添加member元素到集合key中.如果key 的类型不是集合则返回错误.返回新成功添加到集合里元素的数量,不包括已经存在于集合中的元素.
SREM,在key集合中移除指定的元素. 如果指定的元素不是key集合中的元素则忽略 如果key集合不存在则被视为一个空的集合,该命令返回0.如果key的类型不是一个集合,则返回错误.
SADD letters a,添加一个元素a,返回1,表示添加成功。再SADD letters a b c,3个元素,由于a已经存在,所以只添加了b c这2个元素,返回2。
SREM a删除了a元素,并返回1
获得集合中所有元素
上面用到了SMEMBERS命令,表示返回集合所有元素,更多细节:SMEMBERS
判断元素是否在集合中
由于集合底层用的散列hash,所以这个操作速度很快,时间复杂度为O(1)。当值存在时,返回1,反之返回0
更多细节:SISMEMBER
集合间的运算
SDIFF key [key...]
SINTER key [key...]
SUNION key [key...]
redis的集合类型也可以进行数学概念上的集合间运算,分别代表
差集
A-B表示{x|x∈A 且x∉B},这个与数学概念一致
集合A与B做差集,A中有1,2,3的3个元素,集合B有2,3,4的3个元素,1在A中存在而B中不存在,所以A-B是1,反之B-A为4
交集
A∩B表示{x|x∈A 且x∈B},表示集合A,B中的公共元素,为2,3
并集
A∩B表示{x|x∈A 或x∈B},表示集合A,B中的所有元素,为1,2,3,4
更多参考:SDIFF
有序集合跟上面集合的区别就是有序!
增加元素
ZADD key score member [score member]
将所有指定成员添加到键为key
有序集合(sorted set)里面。 添加时可以指定多个分数/成员(score/member)对。 如果指定添加的成员已经是有序集合里面的成员,则会更新该成员的分数(scrore)并更新到正确的排序位置。如果key
不存在,将会创建一个新的有序集合(sorted set)并将分数/成员(score/member)对添加到有序集合,就像原来存在一个空的有序集合一样。
比如上面一个记分板的例子,记录NBA球星的生涯最高得分。
如果某位球星得分有更新,直接重新设置,会重新覆盖
获得排名在某个范围的元素列表
上面用到ZRANGE 0 -1命令显示所有的元素。索引从0开始,负数表示从后向前查找
ZRANGE key start stop [WITHSCORES]
如果要在获得元素的同时获取分数,在命令尾部加上WITHSCORES。更多命令参考:ZRANGE
增加某个元素的分数
ZINCRBY key increment member
上面增加Iverson的分数是直接用ZADD更新的,其实还有一个办法就是用INCRBY直接加
更多参考:ZINCRBY