0
点赞
收藏
分享

微信扫一扫

【Redis - 2】Redis高级特性

Alex富贵 2022-03-17 阅读 40
redis缓存

【Redis - 2】Redis高级特性

【Redis - 2】Redis高级特性

1. 发布订阅

  1. 发布订阅

    # 发布内容,向指定频道发布内容
    publish channel message
    

  2. 订阅频道

    # 订阅频道,一次可以订阅多个频道
    subscribe channel [channel ...]
    

  3. 取消订阅

    # 取消订阅的时候,不可以在已经订阅的界面内取消,因为这个时候已经阻塞了
    unsubscribe [channel [channel ...]]
    
  4. 订阅指定的模块

    psubscribe pattern [pattern ...]
    例如:psubscribe *sports,订阅以sports结尾的频道
    例如:psubscribe news*,订阅以news开头的频道
    例如:psubscribe news-weather,订阅news-weather频道
    

2. 事务执行

  1. 语法

  2. 正确时的执行效果

  3. 事务中止

  4. 事务错误

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3KgIxEMO-1647523980263)(C:/Users/Apricity/AppData/Roaming/Typora/typora-user-images/image-20220317212427708.png)]

  5. 乐观锁

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z51tbO5B-1647523980263)(C:/Users/Apricity/AppData/Roaming/Typora/typora-user-images/image-20220317212946466.png)]

    两次执行结果不同,是因为第二次事务执行之前,其他客户端修改了a的值,导致事务失败

3. 数据淘汰和内存回收

  • 数据过期策略

    • 定时过期:为每一个key创立一个监视器,一旦过期,立即删除,对内存比较友好,但是会占用较多的cpu资源来监视key
    • 惰性过期:key被访问的时候,判断是否过期,这种情况对cpu资源比较友好,但是对内存不太友好
    • 定期过期:每隔一段时间,清除一定数量的过期的key,时间和数量都是可以调整的
  • 淘汰策略

4. 数据持久化

4.1 RDB机制

数据如何写入磁盘

4.2 AOF机制

打开方式

5. 管道通信

在大批量数据输入的时候,比如向数据库中插入10000条数据,如果仅仅是使用循环输入语句的话,需要的时间过长,如下

public class ConnectionUtil {
    @Test
    public void getRedis(){
        Jedis jedis = new Jedis("ip地址",6379);
        jedis.auth("redis密码");
        jedis.flushAll();
        long  start = System.currentTimeMillis();

        for (int i= 1;i<10000;i++){
            jedis.set("key"+i, String.valueOf(i));
        }
        long  end = System.currentTimeMillis();
        System.out.println("time :   " + (end-start));
    }
}

但是可以通过管道技术,将批量的操作存放在管道中,一次性的提交给redis,增加效率,如下

public class ConnectionUtil {
    @Test
    public void getRedis(){
        Jedis jedis = new Jedis("120.55.39.33",6379);
        jedis.auth("redis");
        jedis.flushAll();
        Pipeline pipeline = jedis.pipelined();
        long  start = System.currentTimeMillis();
        for (int i= 1;i<10000;i++){
            pipeline.set("key"+i, String.valueOf(i));
        }
        long  end = System.currentTimeMillis();
        System.out.println("time :   " + (end-start));
    }
}
举报

相关推荐

0 条评论