问题1:redis的事务
redis的事务是通过 pipelined connection来完成相关的一系列命令的实现操作的。redis常见的对于数据结构的操作是全部封装在了RedisOperations中的。
redis对于不同的数据类型的操作存在不同的。
StringRedisTemplate extends RedisTemplate<String, String> 对应的继承了基础的RedisTemplate的。所以平常如果是基础使用的话,推荐使用redisTemplate。这样的话,也是符合多态的结构的。RedisTemplate对应的是整个操作的入口的。
private final ValueOperations<K, V> valueOps = new DefaultValueOperations<>(this);
private final ListOperations<K, V> listOps = new DefaultListOperations<>(this);
private final SetOperations<K, V> setOps = new DefaultSetOperations<>(this);
private final StreamOperations<K, ?, ?> streamOps = new DefaultStreamOperations<>(this,
ObjectHashMapper.getSharedInstance());
private final ZSetOperations<K, V> zSetOps = new DefaultZSetOperations<>(this);
private final GeoOperations<K, V> geoOps = new DefaultGeoOperations<>(this);
private final HyperLogLogOperations<K, V> hllOps = new DefaultHyperLogLogOperations<>(this);
private final ClusterOperations<K, V> clusterOps = new DefaultClusterOperations<>(this);
对应的代码中封装了常见的redis的数据结构的操作实现的。
对于复杂的redis的操作的话,推荐使用的是Pipelined的操作实现的。这个是有用途的使用场景的。
redis的事务操作是如下的:redis的事务不是原子性的,不支持回滚操作实现。redis的事务是使用如下的方式实现的。
RedisTemplate redisTemplate=new RedisTemplate();
redisTemplate.multi();
redisTemplate.delete(“hello”);
redisTemplate.exec();
这个操作出现异常是不会回滚的操作实现的。
下面对应的是使用方式的。redisTempate的设计有点类似于es的restHighLevelClient实现相关的操作实现的。
推荐参考 https://blog.csdn.net/yitian_z/article/details/104265069
redisTemplate.opsForValue().set(“key1”, “value1”);
redisTemplate.opsForValue().set(“int_key”, “1”);
stringRedisTemplate.opsForValue().set(“int”, “1”);
stringRedisTemplate.opsForValue().increment(“int”, 5);
redisTemplate.opsForList().set(“hello”,0,String.valueOf(“many world”));
redisTemplate.opsForValue().set(“world”,“good”);
redisTemplate.opsForSet().add(“many”,“world”);
#下面的语句可以获取得到对应的redis的连接的,可以执行更为底层的redis的操作实现的。
RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
问题2:redis的pipeline的常见的操作
问题3:redis和mysql怎么保证数据的一致性
方案一:先更新mysql,后更新redis,使用redis的失效机制,最终保证一致性操作,但是也是会存在不一致性的情况的。这个方案不推荐使用。
方案二:延时双删,先删除redis的数据,再删除mysql的数据,延迟个几百毫秒之后的话,载删除redis中的数据。这种方式可以确保数据的一致性的。是一种数据一致性的最终的解决方案的。
延时双删最好的最后一部的解决方案,可以采用这样的方式来实现的,一百的是,使用定时任务调度框架是最好的处理方式的。
比较好的: 项目整合quartz等定时任务框架,去实现延时3–5s再去执行最后一步任务
redis常见的相关问题的解答
版权声明:本文为qq_33409840原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。