【Redis - 2】Redis高级特性
【Redis - 2】Redis高级特性
1. 发布订阅
-
发布订阅
# 发布内容,向指定频道发布内容 publish channel message
-
订阅频道
# 订阅频道,一次可以订阅多个频道 subscribe channel [channel ...]
-
取消订阅
# 取消订阅的时候,不可以在已经订阅的界面内取消,因为这个时候已经阻塞了 unsubscribe [channel [channel ...]]
-
订阅指定的模块
psubscribe pattern [pattern ...] 例如:psubscribe *sports,订阅以sports结尾的频道 例如:psubscribe news*,订阅以news开头的频道 例如:psubscribe news-weather,订阅news-weather频道
2. 事务执行
-
语法
-
正确时的执行效果
-
事务中止
-
事务错误
-
乐观锁
两次执行结果不同,是因为第二次事务执行之前,其他客户端修改了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));
}
}