redis的基本用法
key的基本设置
-
设置key
set key value
-
获取key
get key
-
模糊匹配key key后面接正匹配表达式
key *
-
判断是否存在key 存在返回1 不存在返回0
exists key
-
查看key的类型
type key
-
删除key 其中unlink key 为异步删除
del key unlink key
-
为key设置过期时间 second为时间 单位为秒
expire key second //例子 expire key 10
-
查看距离key过期时间 返回-1为永不过期 -2 为已过期
ttl key
-
redis默认具有16个库 (0-15)切换库
// 0是默认库 切换其他库直接写切换库的数字 select 2
-
查看当前库的key的数量
dbsize
-
清空当前库(谨慎使用)
flushdb
-
清空所有库(谨慎使用)
flushall
redis常用数据类型
String类型
简介
String 是 Redis 最基本的类型,你可以理解成与Memcached一模一样的类型,一个 key对应一个 value。
String 类型是二进制安全的。意味着 Redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
String 类型是 Redis 最基本的数据类型,一个Redis 中字符串 value 最多可以是512M
常用命令
-
设置值 set 如果当前库已有相同名称的key 覆盖掉原先的值 保存现在的值
set k1 apple
-
获取值 get
get k1
-
追加value值 append (返回值为value的长度)
append k1 banana
-
获取value的长度 strlen
strlen k1
-
setnx 设置值 与set的区别为如果当前key已经有数据了,不能进行设置,可以配合过期时间实现分布式锁
//返回0 设置不成功 setnx k1 aaa
-
value 自增 incr 只能对数字值操作 如果为空 则把值设置为1 对储存在指定的key值进行原子性操作
set k2 1 incr k2 //
-
value 自减
decr k2
-
incrby / decrby <步长>将 key 中储存的数字值增减。自定义步长
//value 加10 incrby k2 10 //value 减10 decrby k2 10
-
一次性设置多个string数据 mset …
mset m1 aaa m2 bbb m3 ccc
-
一次性获取多个数据 mget …
mget m1 m2 m3
-
msetnx … 原子性操作 其中有有一个key值重复 则全部设置不成功
// 设置失败 因为当前库中m1 msetnx u1 ooo u2 jjj m1 vvv //设置成功 msetnx u1 ooo u2 jjj
-
获取value中部分值 getrange key start end
//开始位置和结束位置都会取 getrange m1 0 1
-
替换value中的部分值 setrange key <起始位置> value
set m1 abcdefg setrange m1 2 bb
-
setex key second value 设置值时同时设置过期时间 用于分布式锁
//10为过期时间单位秒 setex q1 10 qqqqq
-
以新值换旧值 getset key valuenew
getset m1 bbb get m1
数据结构
String 的数据结构为简单动态字符串(Simple Dynamic String,缩写 SDS)。是可以修改的字符串,内部结构实现上类似于 Java 的 ArrayList,采用预分配余空间的方式来减少内存的频繁分配.“
List 类型
简介
单键多值
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。“
它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
常用命令
-
从左边或者右边插入一个或多个数据 lpush / rpush …
lpush leftList a b c d rpush rightList z y x
-
通过下标索引获取元素(从左到右) lrange key start end
//获取全部元素 lrange leftList 0 -1 //获取部分元素 lrange rightList 0 2
-
从左边或者右边吐出一个值 lpop /rpop 当所有值被取出 key自动被删除 (值在键在,值亡键亡)
lpop leftList rpop rightList
-
从一个列表右边吐出一个值拿到另一个列表的左边 rpoplpush
rpoplpush leftList rightList
-
在某个值前面或者后面插入一个新值 linsert before / after
linsert leftList before b c linsert leftList after b c
-
从左边删除n个相同的value值 lrem value
lrem leftList 2 c
-
将key的下标为index的value替换 lset
lset leftList 2 m
数据结构
List 的数据结构为快速链表 quickList。首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是 ziplist,也即是压缩列表。
它将所有的元素紧挨着一起存储,分配的是一块连续的内存。“当数据量比较多的时候才会改成 quicklist。“
因为普通的链表需要的附加指针空间太大,会比较浪费空间。
Redis 将链表和 ziplist 结合起来组成了 quicklist。也就是将多个ziplist 使用双向指针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。
set类型
常用命令
-
添加数据 sadd …将一个或多个值添加到集合中去 如果集合中已经存在 则忽略
sadd sk1 a b c d
-
取出集合中所有的值smembers
smembers sk1
-
判断集合中是否有value 有返回1 无返回0 sismember
sismember sk1 a sismembet sk1 m
-
获取集合中的元素个数 scard
scard sk1
-
删除集合中的某个元素 srem …
srem sk1 a
-
随机吐出集合中的一个值
spop sk1
-
随机从集合中拿出n个元素 不会删除元素srandmember
srandmember sk1 2
-
把集合中的一个值从一个集合移动到另外一个集合 smove value
sadd sk2 m k l j b d smove sk1 sk2 a
-
获取两个集合的交集 sinter
sinter sk1 sk2
-
获取两个集合中的并集 sunion
sunion sk1 sk2
-
获取两个集合的差集 sdiff
sdiff sk1 sk2
数据结构
Set 数据结构是 dict 字典,字典是用哈希表实现的。
Java中 HashSet 的内部实现使用的是 HashMap,只不过所有的 value 都指向同一个对象Redis 的rset 结构也是一样,它的内部也使用 hash结构,所有的 value都指向同一个内部值。
hash
简介
Redis hash 是一个键值对集合。
Redis hash 是一个 string类型的 field 和 value 的映射表,hash 特别适合用于存储对象。类似Java里面的Map<String.Object>
用户ID为查找的 key,存储的 value用户对象包合姓名,年龄,生日等信息,如果用普通的 key/value结构来存储
主要有以下2种存储方式:
hash方式:通过 key(用户 ID)+field(属性签)就可以作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题。
key | field | value |
---|---|---|
name | 张三 | |
age | 20 | |
gender | 男 |
常用命令
-
添加数据 hset
hset user:001 name 张三 hset user:001 age 20 hset uset:001 genner 男
-
获取数据 hget 从集合中拿出filed 属性值
hget user:001 name hget user:001 age
-
一次性添加多个filed属性 hmset …
hmset user:002 name 李四 age 20 genner 女
-
查看hash表中key的filed属性是否存在 hexists
hexists user:001 name hexists user:001 score
-
列出hash的所有field值 hkeys
hkeys user:001
-
列出hash的所有value hvals
hvals user:001
-
为hash表中的key的域的value值增加1 hincrby
//加1 hincrby user:001 age 1 //减1 hincrby user:001 age -1 //加10 hincrby user:001 age 10 //减5 hincrby user:001 age -5
-
将hash表key的域field的值设置为value 当且仅当field不存在时 才可以添加
//不可以添加 当前user:001中已经包含age hsetnx age 10 //可以添加 当前user:001中不包含score hsetnx score 100
数据结构
Hash 类型对应的数据结构是两种: ziplist (压缩列表),hashtable (哈希表)。field-value 长度较短且个数较少时,使用 ziplist,否则使用 hashtable。
有序集合zset
简介
Redis有序集合 zset 与普通集合 set 非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score )被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。
因为元素是有序的,所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。
访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。“
常用命令
- 添加有序集合 zadd …
zadd phone 20 huawei 100 xiaomi 200 oppo
-
获取有序集合zrange
[withScores] //不带分数 zrange phone 0 -1 //带分数 zrange phone 0 -1 withScores
-
获取分数期间内的元素 zrangebyscore [withScores] [limit offset count] (由小到大排列)
zrangebyscore phone 100 300 withScores
-
获取由大到小集合 zrevrangebysocre [withScores] [limit offset count]
zrevrangebyscore phone 100 200 withScores
-
修改元素的分值 zincrby
zincrby iphone 20 huawei
-
删除集合下 指定的元素 zrem
zrem iphone huawei
-
统计集合中,分数区间的元素个数 zcount
zcount iphone 100 200
-
返回集合中的排名 从0开始 zrank
zrank iphone huawei