Redis常用五大数据类型
key操作
keys * //查看所有key
set k1 lucy // 添加k1
exits k1 // 判断k1是否存在
type k1 //查看k1类型
del k1 //删除k1
unlike k1 //删除k1(异步删除,不是立马删除,但是查询不到)
expire k1 10 //为k1设置失效时间 10秒
ttl k1 //查看k1剩余过期时间 -1 永不过期 -2 已过期
select 0 //切换到0号数据库
dbsize //查看当前数据库的key数量
flushdb //清除当前库
flushall //清除所有库
字符串String
最基本的类型、二进制安全、可以包含任何数据(图片、视频)、value最多为512M
底层
简单动态字符串、类似java的ArrayList、采用预分配冗余空间的方式减少内存频繁分配
命令
set k1 appl //设置k1的value
get k1 //查询k1的value
set k1 apple //修改k1的value
append k1 pencil //追加k1的value并返回长度
setrange k1 0 xiaomi //在value位置0插入 原value值后移 value长度不变
getrange k1 0 3 //查询value 0-3 的值
strlen k1 //查看k1长度
setnx k2 100 //只有k2不存在时才能设置成功
incr k2 //设置k2的value +1 原子性操作
decr k2 //设置k2的value -1 原子性操作
incrby k2 11 //设置k2的value +11 原子性操作
decrby k2 4 //设置k2的value -4 原子性操作
mset k3 v3 k4 v4 //批量设置key-value
mget k3 k4 //批量查询key
msetnx k5 v5 k6 v6 //批量设置key-value key不存在才能设置成功 否则都失败
setex k7 20 v7 //设置k7的value和过期时间 20秒
getset k7 v7.1 //用新值换旧值
列表List
单键多值、有序(按插入顺序排序)、可以插入到头部或尾部
底层
快速链表quickList
元素较少时使用连续的内存空间存储,称为zipList,元素多的时候使用quickList,即将多个zipList以双向链表的形式改成quickList
命令
lpush k1 v1 v2 v3 //从左边加入多个值
lpush k2 v10 v20 v30 //从左边加入多个值
lrange k1 0 -1 //获取所有值
rpush k1 v1 v2 v3 //从右边加入多个值
lpop k1 //从左边弹出值
rpop k1 //从右边弹出值 值在键在 值亡键亡
rpoplpush k1 k2 //从k1的右边弹出一个value并放入k2的value右边
lindex <key><index> //按照索引下标获得元素(从左到右)
llen <key> //获得列表长度
linsert <key> before <value><newvalue> //在<value>的后面插入<newvalue>插入值
lrem <key><n><value> //从左边删除n个 value(从左到右)
lset <key><index><value> //将列表key下标为index的值替换成value
集合Set
去重、无序 添加、查询、删除都是O(1)
底层
dict字典,字典用hash表实现
命令
sadd <key> <value1><value2>.... //将一个或多个 member 元素加入到集合 key 中,已经存在的 member 元素将被忽略
smembers <key> //取出该集合的所有值
sismember <key><value> //判断集合<key>是否为含有该<value>值,有1,没有0
scard<key> //返回该集合的元素个数
srem <key><value1><value2> .... //删除集合中的某个元素。
spop <key> //随机从该集合中吐出一个值
srandmember <key><n> //随机从该集合中取出n个值 不会从集合中删除
smove <source><destination><value> //把集合中一个值从一个集合移动到另一个集合
sinter <key1><key2> //返回两个集合的交集元素
sunion <key1><key2> //返回两个集合的并集元素
sdiff <key1><key2> //返回两个集合的差集元素(key1中的,不包含 key2 中的)
哈希Hash
value是一个String类型的field-value映射表,适合存储对象,类似java里面的Map<String, Object>
底层
field-value长度较短且个数较少时使用zipList(压缩链表),否者使用hash表
命令
hset <key><field><value> //给<key>集合中的<field>键赋值<value>
hget <key1><field> //从<key1>集合<field>取出 value
hmset <key1><field1><value1><field2><value2>... //批量设置 hash 的值
hexists<key1><field> //查看哈希表 key 中,给定域 field 是否存在
hkeys <key> //列出该 hash 集合的所有 field
hvals <key> //列出该 hash 集合的所有 value
hincrby <key><field><increment> //为哈希表 key 中的域 field 的值加上增量 1 -1
hsetnx <key<field><value> //将哈希表 key 中的域 field 的值设置为 value,当且仅当域field 不存在
有序集合Zset
有序、去重、应用场景:排行榜
底层
SortedSet(zset)是Redis提供的独特的数据结构,一方面等价于java的Map<String,Double>
数据结构,可以给每一个value赋值权重score,另一方面又类似TreeSet,内部按照score排序,可以得到每个value的名次。
zset底层使用了两个数据结构
1.hash用于关联value和score,保障value的唯一性,可以通过value找到相应的score
2.跳跃表可以飞value排序,可以根据score的范围获取元素列表
命令
zadd <key><score1><value1><score2><value2> //将一个或多个 member 元素及其 score 值加入到有序集 key 当中
//返回有序集 key 中,下标在<start><stop>之间的元素 带withscores,可以让分数一起和值返回到结果集
zrange <key><start><stop> [withscores]
//返回有序集key中,所有score值介于min和max之间(包括min或max)的成员,有序集成员按score值递增(从小到大)次序排列
zrangebyscore <key><min><max> [withscores] [limit offset count]
zrevrangebyscore <key><max><min> [withscores] [limit offset count] //同上,改为从大到小排列
zincrby <key><increment><value> //为元素的 score加上增量
zrem <key><value> //删除该集合下,指定值的元素
zcount <key><min><max> //统计该集合,分数区间内的元素个数
zrank <key><value> //返回该值在集合中的排名,从0开始