本文使用命令行模式进行操作
(1)keys
keys的作用是返回所有符合条件的key的列表
*是返回所有的,名字不限制
也可以使用限制
这个命令的原理是查询到所有名字符合条件的,然后返回
练习可以用,但是千万别在生产环境使用,如果生产环境有800w个key,即使使用了通配符进行名字的限制也是挨个去查然后过滤,会造成很恶劣的影响
如果只是要看当前系统有多少个key的话,可以使用dbsize命令,这个是O(1)级别的:
(2)EXPIRE及ttl
这组命令是设置及查看过期时间
大于等于0代表实际的秒数(默认为秒),-1代表永不过期,-2代表不存在
这里的坑:坑一:如果重新设置了key对应的value的值,如果没有设置过期时间,那这个key就永不过期了
坑2:只能设置顶级的key的过期时间,对于list或者set等复杂结构内部的某一条记录是无法设置过期时间的。
(3)rename
重新给key指定名字,这里要注意rename到的目标值是否存在:
如果存在的话,会被当前的值覆盖
如果目的是存在则不覆盖也不重命名,可以使用renamenx(推荐使用避免覆盖了有用的数据)
(4)exists
key是否存在,1表示存在,0表示不存在
(5)del
删除key对应的数据
可以一次删除多个:
del命令返回的数字代表删除成功了多少个
(6)redis的key的命名
业务名:对象名:id(或者其他能代表一条数据的属性):属性
以下命令为string类型的命令
(7)mset mget
批量设置(获取)key和value
批量命令可以提高性能:
set n次:n次网络+n次命令时间(redis执行时间)
mset n个key:1次网络+n次命令时间(redis执行时间)
(8)set
set 设置值
set key value
set命令有几个选项:
ex seconds: 为键设置秒级过期时间。
px milliseconds: 为键设置毫秒级过期时间。
nx: 键必须不存在,才可以设置成功,用于添加(分布式锁常用)。
xx: 与nx相反,键必须存在,才可以设置成功,用于更新。
(9) incr 和 decr
(10)getset
设置新的值,返回原来键的值
要求原来的值必须存在
(11)setrange getrange
设置指定范围的值
--以下命令为hash类型专用
(12)hset hget
(13)hmset hmget
hset的结果也可以使用hmget去获取
我们也可以成对的使用hmset和hmget
(14)hdel hlen hkeys hvals
hdel 删除hash中的某个键或者多个键
hlen 返回hash的大小
hkeys 返回hash里key的列表
hvals返回hash里value的列表
(15)hgetall HINCRBY
hgetall获取hash中所有的键值对,奇数行代表key,偶数行代表value
HINCRBY类似于整数的自增,需要指定每次增加多少
(16)String和hash的应用场景比较
String优点:简单直观,每个键对应一个值
String缺点:键数过多,占用内存多,用户信息分散,不用于生产环境(键比较少或者记录数比较少的时候也可以使用,不是绝对的)
Hash类型
优点:简单直观,使用合理可以减少内存空间消耗
缺点:老版本(3.2以前)注意ziplist和hashtable两种编码转换,新版本都是用的quicklist
将对象序列化存入string:
优点:编程简单,若使用序列化合理内存使用率高
缺点:序列化和反序列化有一定开销,查询不直观
总结:键比较少,记录比较少的时候可以用string,键比较多,记录比较多推荐使用json
比如一个表中有id,name,age,city等字段,我们就可以使用hmset
需要的时候按需根据hmget或者hget来取就行了
--以下为list相关的命令
(17)rpush、lpush和lrange
rpush从右边插入,每次放到list的最右边
lpush从右边插入,每次放到list的最左边
lrange获取元素不弹出,-1代表最后
(18)lpop、rpop
lpop,弹出最左边的元素,返回值是弹出的元素
rpop,弹出最右边的元素,返回值是弹出的元素
(19)lrem
从左边删除元素 lrem demolist 2 x
表示从demolist的左边找到两个x并删除
(20)ltrim lset
ltrim对list进行裁剪
lset设置list指定下标的值
(21)lindex llen
lindex获取指定下标的值
llen返回list的长度
(22)blpop brpop
阻塞式从左边或者右边弹出元素
跟lpop、rpop的区别是:如果有元素表现相同,如果没有元素的话,会阻塞。
可以使用作为简单的MQ
list的其他一些应用
用作栈
lpush rpop能实现队列
另外电商场景中的文章列表也可以用list实现
---以下命令用于Set类型
(23)sadd smembers
sadd 往set里添加元素,返回值是添加了多少个
smembers是返回集合中的元素
(24)srem
删除集合中的一个或者多个元素
(25)scard sismember srandmember
scard返回set中的元素数量
sismember 判断是不是集合中的元素,1 代表是,0代表不是
srandmember 随机返回一个元素
(26)sinter
求两个集合的交集
(27)sunion
求并集
(28)sdiff
求差集
(29)sinterstore sunionstore sdiffstore
把结果存到另一个set里
------------以下命令为zset类型专用的命令
(30)zadd zcard zscore
zadd 添加一个或者多个元素 ,元素名字和分数是必须的
zcard返回zset中的元素的数量
zscore 返回指定元素的分数(不存在返回nil)
(31)zrank zrevrank
zrank 排名,根据分数从小到大的顺序返回指定元素的排名(从0开始)
zrevrank 排名,根据分数从大到小的顺序返回指定元素的排名(从0开始)
(32)zincrby
增加指定元素的分数
(33)zrange zrevrange
zrange 获取指定范围的元素(从小到大)
zrevrange 获取指定范围的元素(从大到小)
(34)zrangebyscore
计算平均数
(35)bitmap相关的命令
(36)Hyperloglog类型命令
命令本身无难度,关键是理解背后的原理:概率论里的伯努利试验和
(37)GEO类型命令
经纬度是使用52位整数进行编码,然后放在zset里(作为score)