通用指令
序号 | 命令 | 说明 |
---|
1 | KEYS pattern | 查找所有符合给定模式pattern的key |
2 | DEL key [key …] | 删除指定的一个或多个key,当指定的key不存在时会被忽略 |
3 | EXISTS key | 判断key是否存在 |
4 | EXPIRE key seconds | 为指定的key设置存活时间 |
5 | TTL key | 返回指定key的剩余存活时间,以秒为单位,其中返回值-2表示key已死亡,-1表示key永久存活 |
String
序号 | 命令 | 说明 |
---|
1 | set name 张三 | 设置一个key叫name,对应的值为张三 |
2 | get name | 获取key为name的键值 |
3 | mset k1 v1[k2 v2 k3 v3…] | 单次设置多个key-value |
4 | mget k1 k2 k3 | 单次获取多个key对应的value |
5 | keys 通配符 | 展示满足通配符的所有key名;[]:匹配括号内的任意一个字符可以用-表示一个范围;特殊字符需要\来转译 |
6 | exists key | 判断一个可以是否存在;存在返回1,不存在返回0; |
7 | del key [key…] | 删除一个或者多个key |
8 | type key | 获取键值的数据类型 |
9 | incr key | 给key对应的值增1;如果key不存在则新增并初始化为0,然后进行增1操作;返回增加之后的结果值 |
10 | incrby key num | 给key增加指定的数 |
11 | incrbyfloat key fnum | 给key增加指定的浮点数 |
12 | decr key | 给key减1 |
13 | decrby key num | 给key减去指定的数 |
14 | decrbyfloat key fnum | 给key减去指定的浮点数 |
15 | append key value | 将value追加到key当前存储值的末尾 |
16 | getrange key start end | 获取key当前存储值的start到end位置的字符串(end超长时超出部分为空串) |
17 | setrange key start value | 将从start偏移量开始的子串设置为给定值value(redis会自动给增长) |
Hash
序号 | 命令 | 说明 |
---|
1 | HSET key field value | 将哈希表key中的域field的值设为value |
2 | HGET key field | 获取哈希表key中的field的值 |
3 | HMSET key field value [field value …] | 同时将多个field-value(域-值)对设置到哈希表key中 |
4 | HMGET key field [field …] | 返回哈希表key中,一个或多个指定域的值,对于不存在的key返回nil |
5 | HGETALL key | 返回哈希表key中,所有的域和值 |
6 | HKEYS key | 返回哈希表key中的所有域 |
7 | HVALS key | 返回哈希表key中所有域的值 |
8 | HINCRBY key field increment | 为哈希表key中的field的值加上增量increment,增量可为负值 |
9 | HSETNX key field value | 将哈希表key中的域field的值设置为value,当且仅当域field不存在,若field已存在则该操作无效,如果key不存在,则创建哈希表key并完成指令 |
List
序号 | 命令 | 说明 |
---|
1 | LPUSH key value [value …] | 将一个或多个值value插入到列表key的表头,从左到右的顺序插入,则存储的位置是插入时的倒序 |
2 | LPOP key | 移除并返回列表key的头元素 |
3 | RPUSH key value [value …] | 将一个或多个value值插入到列表key的表尾(最右边) |
4 | RPOP key | 移除并返回列表key的尾元素 |
5 | LRANGE key start stop | 返回列表key中指定闭区间的元素,从左向右的范围下标从0开始,从右向左的范围下标从-1开始 |
6 | BLPOP key [key …] timeout | LPOP的阻塞版本,当列表中没有元素时被阻塞,直到等待超时或者发现可弹出元素为止,当列表中有元素时返回被弹出的value和当前弹出元素所属的列表key名 |
7 | BRPOP key [key …] timeout | RPOP的阻塞版本,当列表中没有元素时被阻塞,直到等待超时或者发现可弹出元素为止,当列表中有元素时返回被弹出的value和当前弹出元素所属的列表key名 |
8 | LPOPRPUSH source-key dest-key | 从source-key左侧弹出一个从右侧推入到dest-key |
9 | LINDEX key offset | 返回列表中偏移量为offset的元素 |
10 | LTRIM key start end | 对列表进行修剪,只保留从[start, end]范围内的元素 |
Set
序号 | 命令 | 说明 |
---|
1 | SADD key member [member …] | 将一个或多个 member 元素加入到集合 key 当中 |
2 | SREM key member [member …] | 移除集合 key 中的一个或多个 member 元素 |
3 | SCARD key | 返回集合中元素的数量 |
4 | SISMEMBER key member | 判断 member 元素是否存在集合 key中;存在返回1,不存在返回0 |
5 | SMEMBERS key | 返回集合 key 中的所有元素 |
6 | SINTER key1 [key2 …] | 求交集;返回一个集合的全部成员,该集合是所有给定集合的交集 |
7 | SDIFF key1 [key2 …] | 求差集;返回一个集合的全部成员,该集合是所有给定集合之间的差集 |
8 | SUNION key [key …] | 求并集;返回一个集合的全部成员,该集合是所有给定集合的并集 |
9 | SRANDMEMBER key [count] | 从指定key的set集合中随机取出count个元素,不会移除元素 |
10 | SPOP key [cout] | 从指定key的set集合中随机取出count个元素,会移除元素 |
11 | SMOVE source-key dest-key item | 如果集合source-key包含元素item,就从source-key移除item并添加到dest-key |
SortedSet
序号 | 命令 | 说明 |
---|
1 | ZADD key score member [[score member] [score member]…] | 将一个或多个member元素及其score值加入到有序集合key当中,如果某个member已经存在,则更新这个score值;score可以是整数,也可以是浮点数 |
2 | ZREM key member [member …] | 移除有序集key中的一个或多个成员,不存在的成员将被忽略 |
3 | ZSCORE key member | 返回有序集key中,成员member的score值,如果member元素不是有序集key的成员,或key不存在,返回nil |
4 | ZRANK key member | 返回有序集key中成员member的排名.其中有序集成员按score值升序排列,排名以0为底,也就是说.score值最小的成员排名为0 |
5 | ZREVRANK key member | 返回有序集key中成员member的排名,根据score返回降序排名 |
6 | ZCARD key | 返回有序集合中元素的个数 |
7 | ZCOUNT key min max | 返回有序集key中,score值在min和max闭区间的元素数量 |
8 | ZINCRBY key increment member | 为有序集key的成员的score值加上增量increment |
9 | ZRANGE key start stop [WITHSCORES] | 返回有序集key中,指定区间内的成员,其中成员的位置按score值升序排序;start,stop都以0为底;-1表示最后一个元素位置;使用ZREVRANGE降序排序 |
10 | ZRANGEBYSCORE key min max [WITHSCORES] [ LIMIT offset count] | 返回score介于min和max闭区间的元素,元素按score升序排序;min,max可以是-inf和+inf,代表score的最低和最高值;使用ZRANGEBYSCORE来降序排序;所有闭区间可以通过’(‘符号或者’)'来改成开区间 |
11 | ZDIFF, ZINTER, ZUNION | 求差集, 交集, 并集 |
Jedis实战
hash
Jedis conn = jedisPool.getResource();
Map<String,String> articleData = new HashMap<>();
articleData.put("id", "article:123");
articleData.put("votes", "1");
conn.hmset("article:123", articleData);
Map<String,String> articleData = conn.hgetAll("article:123");
conn.hincrBy("article:123", "votes", 1);
String value = conn.hget("login:", "xxxjdsxxxtoken");
conn.hset("login:", "xxxjdsxxxtoken", "jds888");
conn.hdel("login:", tokens);
set
Jedis conn = jedisPool.getResource();
String voted = "voted:123";
conn.sadd(voted, "jds001");
conn.expire(voted, 7 * 86400);
zset
Jedis conn = jedisPool.getResource();
long now = System.currentTimeMillis() / 1000;
conn.zadd("score:", now + 432, "article:123");
conn.zadd("time:", now, "article:123");
conn.zscore("time:", articleKey)
conn.zincrby("score:", 432, "article:123");
ZParams params = new ZParams().aggregate(ZParams.Aggregate.MAX);
conn.zinterstore(key, params, "group:" + group, order);
conn.expire(key, 60);
Set<String> ids = conn.zrevrange("score:", 0, 25);
Set<String> tokenSet = conn.zrange("score:", 0, 25);
String[] tokens = tokenSet.toArray(new String[tokenSet.size()]);
conn.zrem("recent:", tokens);
conn.zremrangebyrank("viewed:xxxjdsxxxtoken", 0, -26);
long size = conn.zcard("viewed:xxxjdsxxxtoken");
缓存穿透
缓存穿透就是用户请求的数据在缓存中和数据库中都不存在,这样Redis缓存就永远不会生效,这些请求会一直访问数据库
缓存穿透解决方案
- 缓存空对象(一般用该方案): 将空对象保存到缓存中,每次请求过来返回这个缓存的空对象
缺点: 额外的内存消耗;可能造成短期的数据不一致
优化: 每次更新数据库之后删除缓存 - 布隆过滤: 实际上是一种算法,在客户端和Redis之间加一层布隆过滤器,先查看数据在布隆过滤器中是否存在,不存在则直接拒绝,如果存在则正常继续访问Redis和数据库
布隆过滤的原理: 将数据库中的数据基于Hash算法计算出hash值,然后存储到布隆过滤器里
优点: 大大过滤掉缓存穿透现象
缺点: 还是有一点点缓存穿透现象;当访问布隆过滤器数据是否存在时,过滤器返回不存在则数据真的不存在,当过滤器返回数据存在时,数据不一定就真的存在
缓存雪崩
Redis中大量的key在同一时间失效或者Redis宕机(死机),大量请求直接访问数据库的情况称为缓存雪崩
缓存雪崩解决方案
- 针对大量key同时失效的情况:给不同的key设置不同的存活时间(TTL)
- 针对宕机的情况:多用几台机器,一个宕机另一个顶上
缓存击穿
缓存击穿问题也叫热点key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问在瞬间给数据库带来巨大的冲击
缓存击穿解决方案
- 互斥锁: 只允许一个线程来创建缓存,其他线程等待重建缓存的线程执行完,或者去休眠一段时间之后重新访问,重新从缓存获取数据即可
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/0ee5ba1a9561a1d7424f35c0e84ff656.png)
- 逻辑过期: 不设置存活时间,而是在value中设置一个逻辑过期时间的值,一般是创建key的时间加上存活时间;当当前时间超过设置的逻辑过期时间时,通过一个新的线程去重建这个缓存,为了避免多个线程都来重建这个缓存,加互斥锁即可,当其他线程来发现不能够获取锁时,直接把旧的数据返回
key的命名规则
项目名:业务名:类型:id