七 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;    }}

推薦閱讀