redis工具类_SpringBoot 操作 Redis 数据

SpringBoot 操作 Redis 数据

简介

Redis 是一个开源的NoSQL数据库,基于内存的键值存储,速度快。Redis 支持数据结构,如字符串,散列,列表,集和带范围查询的有序集。

5种主要数据类型:

字符串类型    string散列类型      hash列表类型      list集合类型      set有序集合类型  zset

Redis优缺点

直接基于内存读写,不用Redis直接用MySQL,先不说查询性能耗时,一个是直达一个是通过媒介,显而易见,Redis 速度很快 。不过Redis ,仅适用于键值对,并不能替代MySQL,虽然其有持久化,但是也可能会崩溃,损失几秒的数据

项目环境

项目工具环境:

IDE工具,这里是 Jetbrains IDEAMavenJDK1.8Redis 服务器

源码环境地址

https://github.com/Gleans/SpringBootLearn/tree/master/springboot-redis
后面的基于这个项目来操作

定义 RedisTemplate

RedisConfig.java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericToStringSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {
    @Bean
    JedisConnectionFactory jedisConnectionFactory() {
        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
        jedisConnectionFactory.setPassword("ekko1234");
        return jedisConnectionFactory;
    }

    @Bean
    public RedisTemplate redisTemplate() {
        final RedisTemplate redisTemplate = new RedisTemplate<>();
        RedisSerializer stringSerializer = new StringRedisSerializer();
        RedisSerializer jsonString = new GenericToStringSerializer<>(Object.class);
        redisTemplate.setConnectionFactory(jedisConnectionFactory());
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setValueSerializer(jsonString);
        redisTemplate.setHashKeySerializer(stringSerializer);
        redisTemplate.setHashValueSerializer(jsonString);return redisTemplate;
    }
}

操作 Redis 初体验

Spring Boot 的开箱即用的特点0964d19602909f375a9354f72e7eec2c.png
集成 Redis 也是显而易见
在test环境新建测试类 TestRedis.java

import lombok.extern.slf4j.Slf4j;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.MethodSorters;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

//根据测试方法名字搞定执行顺序
@Slf4j
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class TestRedis {

    private RedisTemplate redisTemplate;@Autowiredpublic void setRedisTemplate(RedisTemplate redisTemplate) {this.redisTemplate = redisTemplate;
    }// 做下面的操作
}

操作字符串

在测试类中操作字符串:

    @Test
    public void operateStr(){
        // 存入 key为username  value 为 admin
        redisTemplate.opsForValue().set("username","admin");
        // 获取 key为username
        String username = (String) redisTemplate.opsForValue().get("username");
        System.out.println(username);
    }

执行过后发现存在redis中的数据:0bdea8d1b8b960302a02e70402486ba3.png

操作集合

opsForList()

    @Test
    public void operateList() {
        List userList = new ArrayList<>();
        userList.add("张三");
        userList.add("李四");//循环向userlist左添加值
        userList.forEach(value -> redisTemplate.opsForList().leftPush("userlist", value));//向userlist右添加值
        redisTemplate.opsForList().rightPush("userlist", "麻子");
        log.info("删除前:userlist->{}", redisTemplate.opsForList().range("userlist", 0, 10));/*
          三个参数:
          - key redis中存 key值
          - count 从左或是从右删除,正左负右
          - value 就是需要从list移除的值
          */
        redisTemplate.opsForList().remove("userlist", 0, "麻子");
        log.info("删除后:userlist->{}", redisTemplate.opsForList().range("userlist", 0, 10));
    }

输出:

删除前:userlist->[李四, 张三, 麻子]
删除后:userlist->[李四, 张三]

操作不可重复集合

opsForSet()

    @Test
    public void operateSet(){
        List trap = new ArrayList<>();
        trap.add("工具人");
        trap.add("工具人");
        trap.add("工具人");
        trap.add("四块五的妞");
        trap.add("十元妹子");
        System.out.print(trap.toString());//循环向userlist左添加值
        trap.forEach(value->redisTemplate.opsForSet().add("userSet",value));
        log.info("删除前:userSet->{}",redisTemplate.opsForSet().members("userSet"));// 直接根据set的key值删除
        redisTemplate.opsForSet().remove("userSet","工具人");
        log.info("删除后:userSet->{}",redisTemplate.opsForSet().members("userSet"));
    }

输出:

删除前:userSet->[工具人, 工具人, 工具人, 四块五的妞, 十元妹子]
删除后:userSet->[四块五的妞, 十元妹子]

哈希操作

opsForHash()  相当于在操作实体类

    @Test
    public void operateHash(){
        //添加
        redisTemplate.opsForHash().put("user","username","ekko");
        redisTemplate.opsForHash().put("user","address","Shanghai");
        redisTemplate.opsForHash().put("user","passwd","1234");
        //修改
        redisTemplate.opsForHash().put("user","address","Beijing");
        //删除
        redisTemplate.opsForHash().delete("user","passwd");
    }

结果:050c726cb935014f3c65cd6b17067339.png

总结

数据量大且不长变的还是用缓存接收数据来回操作使用 Redis,持久化时再入库做好缓存击穿的准备利用好 Redis 可以很大程度的减少 MySQL 的压力Redis 常用的操作基本满足需求

小知识

方法名字前加ABCD...是为了让方法有执行顺序
根据测试方法名字搞定执行顺序,在方法上加注解@FixMethodOrder(MethodSorters.NAME_ASCENDING)
日志注解@Slf4j是为了让日志书写更方便

 //之前写日志  
 log.info("输出a"+index+"b");
 //现在
 log.info("输出a{}b",index);

多个参数可以用多个{},总之,喜欢哪个用哪个,谢谢!

阅读原文可评论或与作者交流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java判断日期是否是同一周_JAVA里面怎样判断一个日期是否是星期六或者星期天,给出原代码,多谢!!!!!!!!!!...

分数全部奉上。|void test2(){String tmp "2001-09-02";SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd");try {Date myDate sdf.parse(tmp);Calendar myCalendar Calendar.getInstance();myCalendar.setTime(myDate);int i myCalendar.get(…

python中继承是什么意思_Python面向对象中的继承是什么意思

Python面向对象中的继承是什么意思发布时间&#xff1a;2020-11-09 14:05:42

python ansible模块_ansible常用模块

一、ansible常用模块模块是Ansible执行的最小单位&#xff0c;可以是由Python编写&#xff0c;也可以是Shell编写&#xff0c;也可以是由其他语言编写。一、ping模块测试连接可通性&#xff0c;没有参数。通的话返回pong。1、使用示例ansible all -m ping1、可通&#xff0c;返…

java断点续传 框架_java实现断点续传

用java的URL实现了一个简单的断点续传的列子&#xff0c;不为别的&#xff0c;假如你对断点续传不了解一看就明白了呵呵&#xff0c;算不上高深啊package test;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.io.Ra…

python大文件排序_Python实现大文件排序的方法

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云文件存储NAS是一个可共享访问&#xf…

python入门到实践试题及答案_python编程:入门到实践练习答案

【实例简介】书本《python编程&#xff1a;入门到实践》的课后练习答案【实例截图】【核心代码】练习答案├── Solutions - Chapter 10.docx├── Solutions - Chapter 11.docx├── Solutions - Chapter 15.docx├── Solutions - Chapter 16.docx├── Solutions - Cha…

java年份换算_java中日期的换算处理

JAVA8中的日期API是JSR-310的实现&#xff0c;并且是工作在ISO-8601日历系统基础上的&#xff0c;但我们也可以在非ISO的日历上。JDK8的日期API大致分为以下几个包&#xff1a;1 java.time包&#xff1a;JDK8中的基础包&#xff0c;所有常用的基础类都是这个包的一部分&#xf…

python地理空间_Python批量下载地理空间数据云数据!Python无所不能!-站长资讯中心...

模拟登录这里要用到两个包&#xff1a;requests和json。requests使用前得先安装&#xff1a;pip install requests。In [3]:进群&#xff1a;548377875 即可获取数十套PDF哦&#xff01;import requestsimport json打开地理空间数据云的登录页面。按F12进入开发者工具台&…

mysql 占用swap_查看swap占用情况

查看swap被占用的情况#!/bin/bash# Get current swap usage for all running processes# Erik Ljungstrom 27/05/2011# http://northernmost.org/blog/find-out-what-is-using-your-swap/SUM0OVERALL0for DIR in find /proc/ -maxdepth 1 -type d | egrep "^/proc/[0-9]&q…

python37.dll可能与您正在运行_模块可能与您正在运行的Windows版本不兼容。检查该模块是否与regsvr32.exe的x86或x64...

今天一个网友群里留言&#xff0c;他win8的系统&#xff0c;下载我们的软件无法正常运行&#xff0c;原来他的win8是64位的系统&#xff0c;而我们的软件是32位&#xff0c;而且这个软件还需要一个dll文件&#xff0c;没有注册就无法使用&#xff0c;参考下面的方法解决了1.把T…

java api math_JAVA 函数 Math API

JAVA 函数 Math APIMath.PI 记录的圆周率Math.E 记录e的常量Math中还有一些类似的常量&#xff0c;都是一些工程数学常用量。Math.abs() 求绝对值Math.sin() 正弦函数Math.asin() 反正弦函数Math.cos() 余弦函数Math.acos() 反余弦函数Math.tan() 正切函数Math.atan() 反正切函…

python包的init文件_Python模块包中__init__.py文件功能分析

本文实例讲述了Python模块包中__init__.py文件功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;用django做开发已经一年多的时间&#xff0c;但基本没注意python模块中__init__.py文件存在的意义&#xff0c;偶然看到对它的介绍吓一大跳&#xff0c;这个文件太重要…

java obervable_RxJava中Observable,Completable和Single之间有什么区别

Observable 是通用ReactiveX构建块&#xff0c;它是随时间发送值的事件源 . (因此存在ReactiveX扩展到的每种语言)简而言之&#xff0c;Observable事件是&#xff1a;onNext *(onCompleted | onError)&#xff1f; /(*零或更多&#xff1f; - 零或1)Single和Completable是RxJav…

span 里面的文字不显示_“无糖饮料”显示不含糖,为何还这么甜?原来里面加了这个...

长时间的高温天气让人离不开各种饮料&#xff0c;尤其是冰冻过之后味道更清爽的各种水。当你在外面晒着大太阳汗流浃背&#xff0c;突然听到扭开可乐雪碧瓶盖的那一声“ci~~~~”的时候&#xff0c;是不是瞬间有种眼前有个游泳池的感觉&#xff1f;且慢&#xff0c;更适合夏天的…

java的visitor模式_java设计模式(二十一)访问者模式(Visitor)

介绍访问者模式(Visitor Pattern)&#xff1a;表示一个作用于某对象结构中的各元素的操作&#xff0c;它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式是一种对象行为型模式。简单来说&#xff0c;访问者模式就是一种分离对象数据结构与行为的方…

python多元函数求极小值_使用遗传算法求二元函数的最小值

二元函数为yx1^2x2^2,x∈[-5,5]NIND121; %初始种群的个数(Number of individuals)NVAR2; %一个染色体(个体)有多少基因PRECI20; %变量的二进制位数(Precision of variables)MAXGEN200; %最大遗传代数(Maximum number of generations)GGAP0.8; %代沟(Generation gap)&#xff0c…

testlink mysql配置_TestLink安装配置手册

TestLink安装配置手册范围本文仅作为安装和配置TestLink的参考文档。本文的第一部分为TestLink的安装步骤&#xff0c;第二部分是TestLink的配置方法。本文和其他相关文档可在中寻求帮助一般TestLink安装的步骤如下&#xff1a;1.下载TestLink2.解压文件3.创建数据库4.导入缺省…

python matlibplot绘制矩阵_matplotlib.pyplot.matshow 矩阵可视化实例

这是一个绘制矩阵的函数。用matshow绘制矩阵的例子&#xff1a;import matplotlib.pyplot as pltimport numpy as npdef samplemat(dims):"""Make a matrix with all zeros and increasing elements on the diagonal"""aa np.zeros(dims)for i …

如果有一个人在我创业之前告诉我这些

听别人的个人经历&#xff0c;并持保留态度&#xff0c;结合自己用来参考。 首先验证想法。不要浪费时间来建造无人需要的东西。扼杀你的自我。 创业内容不在于自我&#xff0c;而是关于用户。必须去想用户想要什么&#xff0c;而不是我想要什么的。不要盲目躺平顺从投资者&…

时分秒 java_JAVA 时分秒累加

一、简介有个需求是&#xff0c;累加通话时长&#xff0c;把上次通话时长加上本次通话时长&#xff0c;依次累加。二、实现Testpublic void TestA() throws ParseException {SimpleDateFormat myFormatter new SimpleDateFormat("HH:mm:ss");SimpleDateFormat forma…