七 SpringBoot - Redis 缓存( 二 )


命令说明zadd key score1 val1 score2 val2 score3 val3 ...有序集合添加带score值的元素zscore key val获取集合中某个值对应score值zrange key 0 -1 [withscores]zrange zset1 0 -1 ,结果为所有的值,不带分数;如:zrange zset1 0 -1 ,结果为所有的值,不带分数zrange zset1 0 -1 withscores结果为所有的值和分数zrangebyscore key 开始score 结束score获取score值在开始score-结束score之间的元素zrangebyscore zset1 10 40获取score值在10-40之间的元素,包含10和40zrangebyscore zset1 10 (40不包含40值;(   的含义是不包含zrangebyscore zset1 (10 (40不包含10,40值zrangebyscore zset1 10 50 limit 2 2limit 结果的起始下标 , 获取的个数;limit 含义是限制获取的条数,相当于mysql的分页;zrem key 某score下对应的value值删除元素zcard key获取key对应的值的个数;注意score 和 value是一个整体zcount key score区间获取分值区间内元素个数zrank key values值获得下标值zscore key 对应value值获得value对应分数zrevrank key value值逆序获得对应逆序的下标值zrevrange key 起始下标,结束下标将之前顺序进行倒序zrevrangebyscore  key 结束score 开始score根据score值输出元素zincrby key 增加分值 value值给对应的值增加score值2、Redis整合2.1 spring-boot-starter-data-redis 依赖<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-redis</artifactId></dependency>2.2 redis配置#端口号server:  port: 8096# redis配置spring:  redis:    host: 127.0.0.1 #如果是redis远程服务器,此处redis服务器ip地址    port: 6379 #默认端口#    database: 0 #指定redis数据库,默认是0#    password:   # 密码有就写,没有就省略2.3 SpringBoot框架自动配置的redisTemplate2.3.1 清空数据库//自动装配  SpringBoot框架自动配置的redisTemplate@Autowiredprivate RedisTemplate<Object,Object> redisTemplate;//基于SpringBoot框架自动配置的redisTemplate,操作redis缓存//获取连接RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();//清空数据库中的所有数据log.info("清空数据库中的所有数据");connection.flushDb();2.3.2 添加数据//程序中,添加数据据到redislog.info("------ 基于SpringBoot框架自动配置的redisTemplate 添加数据 ------");redisTemplate.opsForValue().set("kh96_class_name","KGC_KH96");redisTemplate.opsForValue().set("student_num",19);2.3.3 获取数据//程序中 , 从redis获取数据log.info("------ 基于SpringBoot框架自动配置的redisTemplate 获取数据 ------");log.info("****** 根据 班级的key:{},获取班级名称:{} ******","kh96_class_name",redisTemplate.opsForValue().get("kh96_class_name"));log.info("****** 根据 班级的key:{},获取班级人数:{} ******","student_num",redisTemplate.opsForValue().get("student_num"));2.3.4 修改值 (出现错误)//程序中,基于SpringBoot框架自动配置的redisTemplate,操作redis缓存,存在问题//场景:对班级人数进行增减操作 , 比如将班级人数,增加10log.info("------ 基于SpringBoot框架自动配置的redisTemplate 操作数据 ------");redisTemplate.opsForValue().increment("student_num",10);//直接报错,会报500异常: redis.clients.jedis.exceptions.JedisDataException: ERR value is not an integer or out of range//原因,通过系统默认的 redisTemplate,存放key和value值时,会自动使用Object类的序列化和反序列化,导致redis中真实存放的数据不是原始值 , 而是序列化后的值数据结果:

七 SpringBoot - Redis 缓存

文章插图
2.4 自定义redisTemplate2.4.1 fastjson 依赖<dependency>    <groupId>com.alibaba</groupId>    <artifactId>fastjson</artifactId>    <version>1.2.62</version></dependency>2.4.2  自定义redisTemplate 配置类//Redis自定义配置类,实现一个自定义序列化方式的 redisTemplate,提缓缓掉默认自动配置的 redisTemplate,实现String类型任意类型的value@Configurationpublic class RedisConfig {    @Bean    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {        // 自定义redisTemplate的模板对象        RedisTemplate<String, Object> template = new RedisTemplate<>();        // 设置连接工厂        template.setConnectionFactory(redisConnectionFactory);        //由于要通过程序操作远程的redis数据库 , 必须支持序列化,才可以让程序中的数据,在网络中传输        //定义String类型的序列化方式        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();        // 定义fastjson序列化方式,可以序列化任何对象        FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);        // 需改为新的序列化方式        template.setKeySerializer(stringRedisSerializer);        template.setValueSerializer(fastJsonRedisSerializer);        template.setHashKeySerializer(stringRedisSerializer);        template.setHashValueSerializer(fastJsonRedisSerializer);        // 初始化为新的模板        template.afterPropertiesSet();        return template;    }}

推荐阅读