Redis学习

通用指令

序号命令说明
1KEYS pattern查找所有符合给定模式pattern的key
2DEL key [key …]删除指定的一个或多个key,当指定的key不存在时会被忽略
3EXISTS key判断key是否存在
4EXPIRE key seconds为指定的key设置存活时间
5TTL key返回指定key的剩余存活时间,以秒为单位,其中返回值-2表示key已死亡,-1表示key永久存活

String

序号命令说明
1set name 张三设置一个key叫name,对应的值为张三
2get name获取key为name的键值
3mset k1 v1[k2 v2 k3 v3…]单次设置多个key-value
4mget k1 k2 k3单次获取多个key对应的value
5keys 通配符展示满足通配符的所有key名;[]:匹配括号内的任意一个字符可以用-表示一个范围;特殊字符需要\来转译
6exists key判断一个可以是否存在;存在返回1,不存在返回0;
7del key [key…]删除一个或者多个key
8type key获取键值的数据类型
9incr key给key对应的值增1;如果key不存在则新增并初始化为0,然后进行增1操作;返回增加之后的结果值
10incrby key num给key增加指定的数
11incrbyfloat key fnum给key增加指定的浮点数
12decr key给key减1
13decrby key num给key减去指定的数
14decrbyfloat key fnum给key减去指定的浮点数
15append key value将value追加到key当前存储值的末尾
16getrange key start end获取key当前存储值的start到end位置的字符串(end超长时超出部分为空串)
17setrange key start value将从start偏移量开始的子串设置为给定值value(redis会自动给增长)

Hash

序号命令说明
1HSET key field value将哈希表key中的域field的值设为value
2HGET key field获取哈希表key中的field的值
3HMSET key field value [field value …]同时将多个field-value(域-值)对设置到哈希表key中
4HMGET key field [field …]返回哈希表key中,一个或多个指定域的值,对于不存在的key返回nil
5HGETALL key返回哈希表key中,所有的域和值
6HKEYS key返回哈希表key中的所有域
7HVALS key返回哈希表key中所有域的值
8HINCRBY key field increment为哈希表key中的field的值加上增量increment,增量可为负值
9HSETNX key field value将哈希表key中的域field的值设置为value,当且仅当域field不存在,若field已存在则该操作无效,如果key不存在,则创建哈希表key并完成指令

List

序号命令说明
1LPUSH key value [value …]将一个或多个值value插入到列表key的表头,从左到右的顺序插入,则存储的位置是插入时的倒序
2LPOP key移除并返回列表key的头元素
3RPUSH key value [value …]将一个或多个value值插入到列表key的表尾(最右边)
4RPOP key移除并返回列表key的尾元素
5LRANGE key start stop返回列表key中指定闭区间的元素,从左向右的范围下标从0开始,从右向左的范围下标从-1开始
6BLPOP key [key …] timeoutLPOP的阻塞版本,当列表中没有元素时被阻塞,直到等待超时或者发现可弹出元素为止,当列表中有元素时返回被弹出的value和当前弹出元素所属的列表key名
7BRPOP key [key …] timeoutRPOP的阻塞版本,当列表中没有元素时被阻塞,直到等待超时或者发现可弹出元素为止,当列表中有元素时返回被弹出的value和当前弹出元素所属的列表key名
8LPOPRPUSH source-key dest-key从source-key左侧弹出一个从右侧推入到dest-key
9LINDEX key offset返回列表中偏移量为offset的元素
10LTRIM key start end对列表进行修剪,只保留从[start, end]范围内的元素

Set

序号命令说明
1SADD key member [member …]将一个或多个 member 元素加入到集合 key 当中
2SREM key member [member …]移除集合 key 中的一个或多个 member 元素
3SCARD key返回集合中元素的数量
4SISMEMBER key member判断 member 元素是否存在集合 key中;存在返回1,不存在返回0
5SMEMBERS key返回集合 key 中的所有元素
6SINTER key1 [key2 …]求交集;返回一个集合的全部成员,该集合是所有给定集合的交集
7SDIFF key1 [key2 …]求差集;返回一个集合的全部成员,该集合是所有给定集合之间的差集
8SUNION key [key …]求并集;返回一个集合的全部成员,该集合是所有给定集合的并集
9SRANDMEMBER key [count]从指定key的set集合中随机取出count个元素,不会移除元素
10SPOP key [cout]从指定key的set集合中随机取出count个元素,会移除元素
11SMOVE source-key dest-key item如果集合source-key包含元素item,就从source-key移除item并添加到dest-key

SortedSet

序号命令说明
1ZADD key score member [[score member] [score member]…]将一个或多个member元素及其score值加入到有序集合key当中,如果某个member已经存在,则更新这个score值;score可以是整数,也可以是浮点数
2ZREM key member [member …]移除有序集key中的一个或多个成员,不存在的成员将被忽略
3ZSCORE key member返回有序集key中,成员member的score值,如果member元素不是有序集key的成员,或key不存在,返回nil
4ZRANK key member返回有序集key中成员member的排名.其中有序集成员按score值升序排列,排名以0为底,也就是说.score值最小的成员排名为0
5ZREVRANK key member返回有序集key中成员member的排名,根据score返回降序排名
6ZCARD key返回有序集合中元素的个数
7ZCOUNT key min max返回有序集key中,score值在min和max闭区间的元素数量
8ZINCRBY key increment member为有序集key的成员的score值加上增量increment
9ZRANGE key start stop [WITHSCORES]返回有序集key中,指定区间内的成员,其中成员的位置按score值升序排序;start,stop都以0为底;-1表示最后一个元素位置;使用ZREVRANGE降序排序
10ZRANGEBYSCORE key min max [WITHSCORES] [ LIMIT offset count]返回score介于min和max闭区间的元素,元素按score升序排序;min,max可以是-inf和+inf,代表score的最低和最高值;使用ZRANGEBYSCORE来降序排序;所有闭区间可以通过’(‘符号或者’)'来改成开区间
11ZDIFF, ZINTER, ZUNION求差集, 交集, 并集

Jedis实战

hash

		// 获取jedis
		Jedis conn = jedisPool.getResource();
		// 文章信息
        Map<String,String> articleData = new HashMap<>();
        // id
        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);  
        // 获取单个value
        String value = conn.hget("login:", "xxxjdsxxxtoken");     
        // 设置单个value
        conn.hset("login:", "xxxjdsxxxtoken", "jds888");
        // 批量删除
        conn.hdel("login:", tokens);

set

        // 获取jedis
        Jedis conn = jedisPool.getResource();
        // 投标id
        String voted = "voted:123";
        // 默认作者已投票
        conn.sadd(voted, "jds001");
        // 设置一周过期
        conn.expire(voted, 7 * 86400);

zset

        // 获取jedis
        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);
        // 两个集合(可以是set,也可以是zset)取交集,
        conn.zinterstore(key, params, "group:" + group, order);
        // 60秒过期
        conn.expire(key, 60);
        // 倒序取前25个
        Set<String> ids = conn.zrevrange("score:", 0, 25);
        // 取前25个
        Set<String> tokenSet = conn.zrange("score:", 0, 25);
        // 转成数组
        String[] tokens = tokenSet.toArray(new String[tokenSet.size()]);
        // 批量删除
        conn.zrem("recent:", tokens);
        // 移除旧纪录,只保留最新的25个
        conn.zremrangebyrank("viewed:xxxjdsxxxtoken", 0, -26);
        // 统计成员数量
        long size = conn.zcard("viewed:xxxjdsxxxtoken");

缓存穿透

缓存穿透就是用户请求的数据在缓存中和数据库中都不存在,这样Redis缓存就永远不会生效,这些请求会一直访问数据库

缓存穿透解决方案

  1. 缓存空对象(一般用该方案): 将空对象保存到缓存中,每次请求过来返回这个缓存的空对象
    缺点: 额外的内存消耗;可能造成短期的数据不一致
    优化: 每次更新数据库之后删除缓存
  2. 布隆过滤: 实际上是一种算法,在客户端和Redis之间加一层布隆过滤器,先查看数据在布隆过滤器中是否存在,不存在则直接拒绝,如果存在则正常继续访问Redis和数据库
    布隆过滤的原理: 将数据库中的数据基于Hash算法计算出hash值,然后存储到布隆过滤器里
    优点: 大大过滤掉缓存穿透现象
    缺点: 还是有一点点缓存穿透现象;当访问布隆过滤器数据是否存在时,过滤器返回不存在则数据真的不存在,当过滤器返回数据存在时,数据不一定就真的存在

缓存雪崩

Redis中大量的key在同一时间失效或者Redis宕机(死机),大量请求直接访问数据库的情况称为缓存雪崩

缓存雪崩解决方案

  1. 针对大量key同时失效的情况:给不同的key设置不同的存活时间(TTL)
  2. 针对宕机的情况:多用几台机器,一个宕机另一个顶上

缓存击穿

缓存击穿问题也叫热点key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问在瞬间给数据库带来巨大的冲击

缓存击穿解决方案

  1. 互斥锁: 只允许一个线程来创建缓存,其他线程等待重建缓存的线程执行完,或者去休眠一段时间之后重新访问,重新从缓存获取数据即可
    在这里插入图片描述
  2. 逻辑过期: 不设置存活时间,而是在value中设置一个逻辑过期时间的值,一般是创建key的时间加上存活时间;当当前时间超过设置的逻辑过期时间时,通过一个新的线程去重建这个缓存,为了避免多个线程都来重建这个缓存,加互斥锁即可,当其他线程来发现不能够获取锁时,直接把旧的数据返回

key的命名规则

项目名:业务名:类型:id

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值