我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringBoot中的Redis 缓存问题及操作方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringBoot中的Redis 缓存问题及操作方法

1、五大基本数据类型和操作

1.1 字符串-string

命令说明
set key value如果key还没有,那就可以添加,如果key已经存在了,那会覆盖原有key的值
get key如果key还没有,获取为(nil),代表key没有被使用,如果key存在,可以获取对应key的值
exists key判断某个key是否存在,返回Integer值1 代表存在,如果 exists car2 则返回0,不存在
move key db将当前数据库存在的键值移动到其它数据库,其中db是数据库的序号
expire key 秒钟为已经存在的key设置过期时间,注意过期之后,从内存中去掉了,是get不到的
ttl key查看还有多少秒过期,-1表示永不过期,-2表示已过期
type key命令用于返回 key 所储存的值的类型
del key根据key值删除
append key value根据key将其值进行字符串拼接
strlen key根据key获取其值的字符串长度,字节数
incr key对key对应数值进行加一操作,对应的字符串值必须是数值
decr key对key对应数值进行减一操作
incrby key 数值对key对应数值按照指定的值进行递增
decrby key 数值对key对应数值按照指定的值进行递减
getrange key 起始位置 结束位置获取指定区间内的值,类似between。。。and的关系,起始位置为0,结束位置为-1 就是返回所有
setrange key 起始位置 具体值设置指定区间内的值,具体值会从起始位置开始覆盖
setex key 过期秒值 真实值设置带过期时间的key,动态设置。
setnx key value只有在 key 不存在时,才会设置 key 的值,如果已经存在了,不覆盖,设置不了;
setnx key value如果返回0 代表没有设置成功,key对应值已经存在,如果返回1代表设置成功;这个就是redis的分布式锁命令,很重要;
mset key1 val1 key2 val2 ....同时设置一个或多个 key-value 对
mget key1 key2 key3 ....获取所有(一个或多个)给定 key 的值。
msetnx key1 val1 key2 val2 .....同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在

1.2 列表-list

list操作起来类似于栈;

命令说明
lpush key val1 val2 val3 ....从左侧开始存放元素,先进后出
lrange key 起始位置 结束位置从左侧开始,指定范围获取元素,-1代表所有
rpush key val1 val2 val3 ....从右侧开始存放元素,先进先出
lpop key从左侧一次取出一个元素
rpop key从右侧一次取出一个元素
lindex key index按照索引下标获得元素(从左到右,左下标从0开始,如果是-1代表最后一个,-2代表倒数第二个)
llen key获取集合元素个数
lrem key 个数 具体的值从左往右删除指定个数等于具体值的元素,返回的值为实际删除的数量,个数0,表示删除全部给定的值
ltrim key 开始index 结束index截取指定范围的值后再赋值给key
rpoplpush 源列表 目的列表移除列表的最后一个元素,并将该元素添加到另一个列表并返回
lset key index value将key集合中的指定下标位置值改为value
linsert key before/after 值1 值2在list某个已有 值1 的前后再添加具体 值2

小结:

  • 它是一个字符串链表,left、right都可以插入添加;
  • 如果键不存在,创建新的链表;
  • 如果键已存在,新增内容;
  • 如果值全移除,对应的键也就消失了;
  • 链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就很惨淡了;

1.3 集合-set

命令说明
sadd key val1 val2 ...集合set中添加元素,如果有重复元素会自动去除
smembers key查看集合中的元素
sismember key val判断val是否在set集合中,如果在返回1 ,不在返回0
scard key获取集合里面的元素个数
srem key value删除集合中元素
srandmember key 某个整数随机出几个数,如果超过最大数量就全部取出
srandmember key 某个整数如果写的值是负数,比如-3 ,表示需要取出3个,但是可能会有重复值。
spop key随机出栈
smove key1 key2将key1里的某个值赋给key2
sdiff key1 key2在第一个set里面而不在后面任何一个set里面的项
sinter key1 key2在两个set中都有的值的交集返回
sunion key1 key2在两个set中所有的值的集合返回,会自动排除重复

1.4 键值对-hash

K V模式不变,但V是一个键值对;

命令说明
hset 父key 子key 子value将父key,增加子键值对,类似属性
hget 父key 子key获取父key,某个子key的值,获取属性值
hmset 父key 子key1 子val1 子key2 子val2 ....批量添加属性
hmget 父key 子key1 子key...批量获取属性
hgetall 父key批量获取属性及值
hdel 父key 子key删除子key属性及值
hlen 父key返回父key中的子key个数,相当于java实体的属性个数
hexists 父key 子key判断父key中是否包含某个子key,结果为1,代表存在
hkeys 父key获取父key中所有的子key
hvals 父key获取父key中的所有的子val
hincrby 父key 子key 值给指定的子key值增加固定的值
hincrbyfloat 父key 子key 值给有指定key的值增加小数
hsetnx 父key 子key 子val如果子key存在则失败,如果不存在则赋值

1.5 有序集合-zset

在set基础上,加一个score值。之前set是k1 v1 v2 v3,现在zset是k1 score1 v1 score2 v2;

命令说明
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和40
zrangebyscore 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框架自动配置的redisTemplate

2.3.1 清空数据库

//自动装配  SpringBoot框架自动配置的redisTemplate
@Autowired
private RedisTemplate<Object,Object> redisTemplate;

//基于SpringBoot框架自动配置的redisTemplate,操作redis缓存
//获取连接
RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
//清空数据库中的所有数据
log.info("清空数据库中的所有数据");
connection.flushDb();

2.3.2 添加数据

//程序中,添加数据据到redis
log.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缓存,存在问题
//场景:对班级人数进行增减操作,比如将班级人数,增加10
log.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中真实存放的数据不是原始值,而是序列化后的值

数据结果:

2.4 自定义redisTemplate

2.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
@Configuration
public 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;
    }

}

2.4.3 使用自定义redisTemplate 重新操作数据

//自动装配自定义 redisTemplate 
@Autowired
private RedisTemplate<String,Object> redisTemplate;

//其他代码不变

操作结果:

2.5 自定义redisUtils工具类

2.5.1 自定义redisUtils工具类

---> RedisUtil 工具类

2.5.2 使用自定义redisTemplate和redisUtils工具类

@GetMapping("/testRedisUtils")
public String testSpringBootRedisUtils(){

    //基于自定义的redisTemplate 和 RedisUtils 工具类,操作redis缓存
    //程序中,添加数据据到redis
    log.info("------ 基于自定义的redisTemplate 和 RedisUtils 工具类 添加数据 ------");
    redisUtils.set("kh96_class_name_utils","KGC_KH96");
    redisUtils.set("student_num_utils",19);

    //程序中,从redis获取数据
    log.info("------ 基于自定义的redisTemplate 和 RedisUtils 工具类 获取数据 ------");
    log.info("****** 根据 班级的key:{},获取班级名称:{} ******","kh96_class_name_utils",redisUtils.get("kh96_class_name_utils"));
    log.info("****** 根据 班级的key:{},获取班级人数:{} ******","student_num_utils",redisUtils.get("student_num_utils"));

    //程序中,基于SpringBoot框架自动配置的redisTemplate,操作redis缓存
    //场景:对班级人数进行增减操作,比如姜班级人数,增加10
    log.info("------ 基于自定义的redisTemplate 和 RedisUtils 工具类 操作数据 ------");
    redisUtils.incr("student_num_utils",10);

    return "工具类 RedisUtils  操作 redis 成功!";

}

2.5.3 程序中如何存放对象到 redis

核心思想:一般都是姜对象转换为json字符串,存入redis,获取对象数据,就先获取json字符串,再转换为对应对象即可;

@GetMapping("/testRedisUtils")
public String testSpringBootRedisUtils(){

    //程序中如何存放对象到 redis
    //核心思想:一般都是姜对象转换为json字符串,存入redis,获取对象数据,就先获取json字符串,再转换为对应对象即可

    //模拟用户登录成功后,将用户信息存入redis中,方便后续从redis中获取用户信息
    User loginUser = User.builder().userId(1001).userName("KH96").userTel("135012030404").build();

    //直接将对象存入redis即可
    log.info("------ 基于自定义的redisTemplate 和 RedisUtils 工具类 存储对象 ------");
    //自动把实体,通过fastjson的序列化方式,转发为JSON字符串存储
    redisUtils.set(loginUser.getUserId().toString(),loginUser);

    //模拟获取登录用户信息,直接从redis获取存入的JSON字符串,转换为目标用户对象
    User realUser = JSON.parseObject(redisUtils.get(loginUser.getUserId().toString()).toString(),User.class);

    log.info("------ 基于自定义的redisTemplate 和 RedisUtils 工具类获取对象:{} ",realUser);

    return "工具类 RedisUtils  操作 redis 成功!";

}

数据结果:

到此这篇关于SpringBoot中的Redis 缓存的文章就介绍到这了,更多相关SpringBoot Redis 缓存内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringBoot中的Redis 缓存问题及操作方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SpringBoot中的Redis 缓存问题及操作方法

这篇文章主要介绍了SpringBoot中的Redis 缓存,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-11-13

Python 使用 Redis 作为缓存的操作方法

目录python 如何使用 Redis 作为缓存一、引言二、什么是 Redis?三、Redis 作为缓存的优势四、安装 Redis 和 Python Redis 库4.1 安装 Redis4.2 安装 Python Redis 库五、使用
Python 使用 Redis 作为缓存的操作方法
2024-10-11

springboot缓存之redis整合的方法

今天小编给大家分享一下springboot缓存之redis整合的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。默认使用的
2023-06-08

SpringBoot中操作Redis的方法是什么

在Spring Boot中操作Redis有多种方法:使用RedisTemplate:RedisTemplate是Spring框架提供的一个用于操作Redis的模板类,它提供了一系列的方法来操作Redis的数据结构,如字符串、哈希、列表、集合
SpringBoot中操作Redis的方法是什么
2024-04-09

SpringBoot项目中使用redis缓存的方法步骤

本文介绍了SpringBoot项目中使用redis缓存的方法步骤,分享给大家,具体如下:Spring Data Redis为我们封装了Redis客户端的各种操作,简化使用。 - 当Redis当做数据库或者消息队列来操作时,我们一般使用Red
2023-05-30

Ajax与IE6缓存问题及解决方法

本篇文章给大家分享的是有关Ajax与IE6缓存问题及解决方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。向大家简单介绍一下Ajax与IE6缓存问题,用ajax请求时,如果出现
2023-06-17

Java SpringBoot操作Redis的方法是什么

这篇文章主要讲解了“Java SpringBoot操作Redis的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java SpringBoot操作Redis的方法是什么”吧!Red
2023-07-05

Python中文件操作的常见问题及解决方法

Python中文件操作的常见问题及解决方法摘要:文件操作是Python编程中非常常见的任务之一。然而,有时会遇到一些常见的问题,如文件不存在、文件写入错误等。本文将介绍一些常见问题,并提供相应的解决方法和代码示例。一、文件操作的常见问题文件
2023-10-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录