本文共 5489 字,大约阅读时间需要 18 分钟。
Redis学习笔记_03
一、事务
1. 简介
Redis事务是Redis提供的一种操作方式,类似于传统数据库中的事务处理。与传统数据库的ACID原子性不同,Redis的事务本身并不保证原子性,但单条命令的执行是原子性的。
Redis事务的本质是一组命令的集合。每条命令在事务中都会被序列化,执行时按顺序执行,确保不会有其他命令的干扰。然而,Redis没有隔离级别的概念,这意味着事务处理可能存在脏读、不可重复读等问题,但这也是Redis设计的特点。
2. Redis事务操作
正常流程
开启事务(multi)后,所有命令都会被加入队列,直到提交(exec)时才执行。以下是典型的流程示例:
127.0.0.1:6379> multiOK127.0.0.1:6379> set k1 v1QUEUED127.0.0.1:6379> set k2 v2QUEUED127.0.0.1:6379> get k1QUEUED127.0.0.1:6379> set k3 v3QUEUED127.0.0.1:6379> exec1) OK2) OK3) "v1"4) OK
事务取消
可以通过DISCARD命令放弃当前事务,或者使用multi discard命令手动取消事务。例如:
127.0.0.1:6379> multiOK127.0.0.1:6379> set k1 v1QUEUED127.0.0.1:6379> set k2 v2QUEUED127.0.0.1:6379> DISCARDOK127.0.0.1:6379> exec(error) ERR EXEC without MULTI
事务错误
Redis事务在执行过程中可能出现两种类型的错误:
例如:
127.0.0.1:6379> multiOK127.0.0.1:6379> set k1 v1QUEUED127.0.0.1:6379> set k2 v2QUEUED127.0.0.1:6379> INCR k1QUEUED127.0.0.1:6379> get k2QUEUED127.0.0.1:6379> exec1) OK2) OK3) (error) ERR value is not an integer or out of range4) "v2"
3. 监控
Redis支持乐观锁机制,通过watch命令对特定键进行监控。在多线程环境下,watch可以避免并发问题。
乐观锁实现
4. Jedis
Jedis是Redis官方推荐的Java客户端,用于在Java应用中操作Redis。以下是Jedis的基本使用方法:
导入依赖
在项目中添加Jedis的依赖:
redis.clients jedis 3.2.0
编码测试
import redis.clients.jedis.Jedis;public class TestPing { public static void main(String[] args) { Jedis jedis = new Jedis("127.0.0.1", 6379); System.out.println(jedis.ping()); }} 常用API
Jedis提供了丰富的API,涵盖String、List、Set、Hash、ZSet等数据结构的操作。所有API命令与Redis命令一致,使用方式类似。
事务支持
import com.alibaba.fastjson.JSONObject;import redis.clients.jedis.Transaction;public class TestTX { public static void main(String[] args) { Jedis jedis = new Jedis("127.0.0.1", 6379); JSONObject jsonObject = new JSONObject(); jsonObject.put("hello", "world"); jsonObject.put("name", "zhangsan"); Transaction multi = jedis.multi(); try { multi.set("user1", jsonObject.toJSONString()); multi.set("user2", jsonObject.toJSONString()); multi.exec(); } catch (Exception e) { multi.discard(); } finally { System.out.println(jedis.get("user1")); System.out.println(jedis.get("user2")); jedis.close(); } }} 5. Spring Boot整合
在Spring Boot中整合Redis,可以使用spring-boot-starter-data-redis依赖。默认使用Lettuce客户端,而非Jedis。
配置
spring.redis.host=127.0.0.1spring.redis.port=6379
测试
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.data.redis.core.RedisTemplate;@SpringBootTestpublic class Redis02SpringbootApplicationTests { @Autowired private RedisTemplate redisTemplate; @Test void contextLoads() { redisTemplate.opsForValue().set("name", "zhangsan"); System.out.println(redisTemplate.opsForValue().get("name")); redisTemplate.opsForValue().set("mykey", "关注狂神说公众号"); System.out.println(redisTemplate.opsForValue().get("mykey")); }} 自定义RedisTemplate
可通过自定义序列化器实现对象存储。以下是一个RedisTemplate的自定义配置:
package com.kuang.config;import com.fasterxml.jackson.annotation.JsonAutoDetect;import com.fasterxml.jackson.annotation.PropertyAccessor;import com.fasterxml.jackson.databind.ObjectMapper;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;@Configurationpublic class RedisConfig { @Bean @SuppressWarnings("all") public RedisTemplate redisTemplate(RedisConnectionFactory factory) { RedisTemplate template = new RedisTemplate<>(); template.setConnectionFactory(factory); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); template.setKeySerializer(stringRedisSerializer); template.setHashKeySerializer(stringRedisSerializer); template.setValueSerializer(jackson2JsonRedisSerializer); template.setHashValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; }} 6. Redis.conf详解
Redis配置文件redis.conf包含了大量的配置选项,以下是一些关键配置:
单位
单位对大小写不敏感,例如G和GB有区别。
快照(持久化)
Redis支持两种持久化方式:RDB和AOF。RDB是将数据持久化为二进制文件,AOF记录每一步命令操作。
APPEND ONLY模式
默认是使用RDB持久化,开启AOF模式可通过appendonly选项配置。
安全
可以设置Redis的密码,默认为无密码。
客户端限制
可以限制客户端的最大连接数,例如maxclients 10000。
RDB压缩
默认开启RDB文件的压缩,可以节省存储空间。
AOF配置
默认关闭AOF模式,开启可以通过appendonly和appendfsync配置同步频率。
备份
bgsave命令用于异步持久化,允许继续处理客户端命令。
7. Redis监控
通过Redis监控工具可以实时监控Redis服务器的状态,包括内存使用、连接数、持久化进度等。
8. Redis持久化
Redis支持两种持久化方式:
默认使用RDB持久化,AOF主要用于高并发场景。
9. Redis高级功能
Redis提供了许多高级功能,如地理分布(Geo),超级键(HyperLogLog),动态键(Redis661),等等。
这些功能可以根据实际需求灵活配置,提升Redis的性能和可用性。
以上内容涵盖了Redis的核心知识和实际应用技巧,希望对您的学习有所帮助!
发表评论
最新留言
关于作者