引入 Redis

news2025/1/14 0:48:58

简介

Jedis

Jedis 是早期的 Redis 的 Java 实现客户端,提供了比较全面的 Redis 命令的支持,其官方网址是:http://tool.oschina.net/uploads/apidocs/redis/clients/jedis/Jedis.html

优点:支持全面的 Redis 操作特性(可以理解为 API 比较全面)。

缺点:使用阻塞的 I/O,且其方法调用都是同步的,程序流需要等到 sockets 处理完 I/O 才能执行,不支持异步;

Jedis 客户端实例不是线程安全的,所以需要通过创建连接池来使用 Jedis。

lettuce

lettuce 是一种可扩展的线程安全的 Redis 客户端,支持异步模式。如果避免阻塞和事务操作,如 BLPOP 和 MULTI/EXEC,多个线程就可以共享一个连接。lettuce 底层基于 Netty,支持高级的 Redis 特性,比如哨兵,集群,管道,自动重新连接和 Redis 数据模型。lettuce 的官网地址是:https://lettuce.io/

优点:支持同步异步通信模式;

Lettuce 的 API 是线程安全的,如果不是执行阻塞和事务操作,如 BLPOP 和 MULTI/EXEC,多个线程就可以共享一个连接。

RedisTemplate

Spring 对 Redis 操作的一层封装,他的底层是通过 Jedis、Lettuce 实现的。如果我们使用 spring-boot-starter-data-redis 则默认时 Lettuce。

RedisTemplate 集群

把单机的 yml 文件改一下就可以了

spring:
  data:
    redis:
      database: 0
      # 没有密码
      #password: 123456
      cluster:
        # 获取失败 最大重定向次数
        max-redirects: 3
        nodes:
          - 192.168.64.100:6381
          - 192.168.64.100:6382
          - 192.168.64.100:6383
          - 192.168.64.100:6384
          - 192.168.64.100:6385
      lettuce:
        pool:
          max-active: 8
          max-wait: -1ms
          max-idle: 8
          min-idle: 0
        cluster:
          refresh:
            #支持集群拓扑动态感应刷新,自适应拓扑刷新是否使用所有可用的更新,默认false关闭
            adaptive: true
            #刷新周期
            period: 2000

RedisTemplate 单机

pom.xml 文件引入依赖
        <!--SpringBoot与Redis整合依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>
yml 配置
spring:
  data:
    redis:
      database: 0
      host: 192.168.64.100
      port: 6379
      # 没有密码
      #password: 123456
      lettuce:
        pool:
          max-active: 8
          max-wait: -1ms
          max-idle: 8
          min-idle: 0
OrderController
@RestController
public class OrderController {
	@Autowired
	private OrderService orderService;
	@PostMapping("/addOrder")
	public Long addOrder(){
		//测试就不传参数了
		return orderService.addOrder();
	}
	@GetMapping("/getOrder")
	public String getOrder(Long id){
		return orderService.getOrder(id);
	}
	//路径传参请求---->   http://localhost:8080/getOrderById/164
	@GetMapping("/getOrderById/{id}")
	public String getOrderByid(@PathVariable("id") Integer id){
		return orderService.getOrder(Long.valueOf(id));
	}
}
OrderService
public interface OrderService {
	long addOrder();
	String getOrder(Long id);
}
OrderServiceImpl
@Service
public class OrderServiceImpl implements OrderService {
	public static final String ORDER_KEY = "order:";
	//StringRedisTemplate是RedisTemplate的子类
	@Autowired
	private StringRedisTemplate redisTemplate;
	@Override
	public long addOrder() {
		//生成订单id
		long keyId = ThreadLocalRandom.current().nextLong(1000)+1;
		//生成订单号
		String orderNo = UUID.randomUUID().toString();
		redisTemplate.opsForValue().set(ORDER_KEY+keyId,"京东订单"+ orderNo);
		//实际场景下,是需要往数据库存的,这里省略
		return keyId;
	}
	@Override
	public String getOrder(Long id) {
		return redisTemplate.opsForValue().get(ORDER_KEY+id);
	}
}
RedisConfig 指定序列化

如果使用的是 StringRedisTemplate 而不是 RedisTemplate 则不需要配置 RedisConfig

RedisTemplate 默认是 JDK 序列化方式

@Configuration
public class RedisConfig {
	/**
	 * redis序列化的工具配置类,下面这个请一定开启配置
	 * 127.0.0.1:6379> keys *
	 * 1) "ord:102"  序列化过
	 * 2) "\xac\xed\x00\x05t\x00\aord:102"   野生,没有序列化过
	 * this.redisTemplate.opsForValue(); //提供了操作string类型的所有方法
	 * this.redisTemplate.opsForList(); // 提供了操作list类型的所有方法
	 * this.redisTemplate.opsForSet(); //提供了操作set的所有方法
	 * this.redisTemplate.opsForHash(); //提供了操作hash表的所有方法
	 * this.redisTemplate.opsForZSet(); //提供了操作zset的所有方法
	 * @param lettuceConnectionFactory
	 * @return
	 */
	@Bean
	public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory)
	{
		RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();

		redisTemplate.setConnectionFactory(lettuceConnectionFactory);
		//设置key序列化方式string
		redisTemplate.setKeySerializer(new StringRedisSerializer());
		//设置value的序列化方式json,使用GenericJackson2JsonRedisSerializer替换默认序列化
		redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());

		redisTemplate.setHashKeySerializer(new StringRedisSerializer());
		redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());

		redisTemplate.afterPropertiesSet();

		return redisTemplate;
	}
}
视图

Jedis

pom.xml 文件引入 jedis
        <!--jedis-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
demo
  // 创建jedis对象	这里的IP和端口号一般写在配置文件里
		Jedis jedis = new Jedis("192.168.64.100",6379);
		// 认证 jedis的密码   如果有的话
		//jedis.auth("111111");
		//客户端完成,可以进行操作
		System.out.println(jedis.ping());

		//key
		Set<String> keys = jedis.keys("*");
		for (String key : keys) {
			System.out.println(key);
		}
		System.out.println("jedis.exists====>"+jedis.exists("k2"));
		System.out.println(jedis.ttl("k1"));
		//String
		//jedis.append("k1","myreids");
		System.out.println(jedis.get("k1"));
		jedis.set("k4","k4_redis");
		System.out.println("----------------------------------------");
		jedis.mset("str1","v1","str2","v2","str3","v3");
		System.out.println(jedis.mget("str1","str2","str3"));
		//list
		System.out.println("----------------------------------------");
		//jedis.lpush("mylist","v1","v2","v3","v4","v5");
		List<String> list = jedis.lrange("mylist",0,-1);
		for (String element : list) {
			System.out.println(element);
		}
		//set
		jedis.sadd("orders","jd001");
		jedis.sadd("orders","jd002");
		jedis.sadd("orders","jd003");
		Set<String> set1 = jedis.smembers("orders");
		for (String string : set1) {
			System.out.println(string);
		}
		jedis.srem("orders","jd002");
		System.out.println(jedis.smembers("orders").size());
		//hash
		jedis.hset("hash1","userName","lisi");
		System.out.println(jedis.hget("hash1","userName"));
		Map<String,String> map = new HashMap<String,String>();
		map.put("telphone","138xxxxxxxx");
		map.put("address","atguigu");
		map.put("email","zzyybs@126.com");//课后有问题请给我发邮件
		jedis.hmset("hash2",map);
		List<String> result = jedis.hmget("hash2", "telphone","email");
		for (String element : result) {
			System.out.println(element);
		}

		//zset
		jedis.zadd("zset01",60d,"v1");
		jedis.zadd("zset01",70d,"v2");
		jedis.zadd("zset01",80d,"v3");
		jedis.zadd("zset01",90d,"v4");
		List<String> zset01 = jedis.zrange("zset01", 0, -1);
		zset01.forEach(System.out::println);
视图

lettuce

pom.xml 引入依赖
        <!--lettuce-->
        <dependency>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
            <version>6.2.1.RELEASE</version>
        </dependency>
demo
  //使用构建器 RedisURI.builder
		RedisURI uri = RedisURI.Builder
				.redis("192.168.64.100")
				.withPort(6379)
				//参数1:用户名,参数2:密码
				.withAuthentication("default","")
				.build();
		//创建连接客户端
		RedisClient client = RedisClient.create(uri);
		StatefulRedisConnection<String, String> conn = client.connect();
		//操作命令api
		RedisCommands<String,String> commands = conn.sync();

		//keys
		List<String> list = commands.keys("*");
		for(String s : list) {
			System.out.println("s = " + s);
		}
		//String
		commands.set("k1","1111");
		String s1 = commands.get("k1");
		System.out.println("String s ==="+s1);

		//list
		commands.lpush("myList2", "v1","v2","v3");
		List<String> list2 = commands.lrange("myList2", 0, -1);
		for(String s : list2) {
			System.out.println("list ssss==="+s);
		}
		//set
		commands.sadd("mySet2", "v1","v2","v3");
		Set<String> set = commands.smembers("mySet2");
		for(String s : set) {
			System.out.println("set ssss==="+s);
		}
		//hash
		Map<String,String> map = new HashMap<>();
		map.put("k1","138xxxxxxxx");
		map.put("k2","atguigu");
		map.put("k3","zzyybs@126.com");//课后有问题请给我发邮件

		commands.hmset("myHash2", map);
		Map<String,String> retMap = commands.hgetall("myHash2");
		for(String k : retMap.keySet()) {
			System.out.println("hash  k="+k+" , v=="+retMap.get(k));
		}

		//zset
		commands.zadd("myZset2", 100.0,"s1",110.0,"s2",90.0,"s3");
		List<String> list3 = commands.zrange("myZset2",0,10);
		for(String s : list3) {
			System.out.println("zset ssss==="+s);
		}

		//sort
		SortArgs sortArgs = new SortArgs();
		sortArgs.alpha();
		sortArgs.desc();

		List<String> list4 = commands.sort("myList2",sortArgs);
		for(String s : list4) {
			System.out.println("sort ssss==="+s);
		}

		//关闭
		conn.close();
		client.shutdown();
视图

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

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

相关文章

搜狗输入法 PC端 v14.4.0.9307 去广告绿化版.

软件介绍 搜狗拼音输入法作为众多用户计算机配置的必备工具&#xff0c;其功能的全面性已为众所周知&#xff0c;并且以其高效便捷的输入体验受到广大使用者的青睐。然而&#xff0c;该软件在提供便利的同时&#xff0c;其内置的广告元素常常为用户带来一定的干扰。为此&#…

代码随想录算法训练营DAY48|C++动态规划Part9|121.买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

文章目录 121.买卖股票的最佳时机思路CPP代码 122.买卖股票的最佳时机II思路CPP代码 123.买卖股票的最佳时机III思路CPP代码 121.买卖股票的最佳时机 力扣题目链接 文章讲解&#xff1a;121.买卖股票的最佳时机 视频讲解&#xff1a;动态规划之 LeetCode&#xff1a;121.买卖股…

由树形解空间入手,深入分析回溯、动态规划、分治算法的共同点和不同点

一、回溯、动态规划、分治 其实这三个算法就可以直接认为是一类算法&#xff0c;它们的共同点都是会涉及到递归。 更需要清楚明白的一点是&#xff0c;它们的解&#xff0c;都是基于一颗递归形式的树上得来的&#xff01;也就是——回溯、动态规划、分治的解空间是 一棵树&am…

ssm+vue的私人健身和教练预约管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的私人健身和教练预约管理系统(有报告)。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通…

深度学习常用优化算法笔记介绍,各种梯度下降法详细介绍

优化算法 mini-batch梯度下降法 当一个数据集其数据量非常大的时候&#xff0c;比如上百万上千万的数据集&#xff0c;如果采用普通的梯度下降法&#xff0c;那么运算速度会非常慢&#xff0c;因为如果使用梯度下降法在每一次迭代的时候&#xff0c;都需要将这整个上百万的数…

机器学习:基于TF-IDF算法、决策树,使用NLTK库对亚马逊美食评论进行情绪分析

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

第一天复习Qt文件读取

Qt文件操作&#xff1a; 1、QFile QTextStream操作文件案例&#xff1a; 1、打开文件 QFile file(absolute filepath | relative path); file.readLine()返回内容长度&#xff0c;如果为-1就是读取失败 file. Close()读取后关闭 file.errorString()返回文件打开发生的错误2、…

数据仓库实验三:分类规则挖掘实验

目录 一、实验目的二、实验内容和要求三、实验步骤1、创建数据库和表2、决策树分类规则挖掘&#xff08;1&#xff09;新建一个 Analysis Services 项目 jueceshu&#xff08;2&#xff09;建立数据源视图&#xff08;3&#xff09;建立挖掘结构 DST.dmm&#xff08;4&#xff…

16.接口自动化学习-编码处理与装饰器

1.编码和解码 编码&#xff1a;将自然语言翻译成计算机可以识别的语言 hello–01010 解码&#xff1a;将机器识别的语言翻译成自然语言 2.编码格式 UTF-8 GBK unicode 3.编码操作 #编码操作str1"hello呀哈哈哈"str2str1.encode(gbk)print(str2)print(type(str2))…

FPGA ov5640视频以太网传输

1 实验任务 使用DFZU4EV MPSoC 开发板及双目OV5640摄像头其中一个摄像头实现图像采集&#xff0c;并通过开发板上的以太网接口发送给上位机实时显示。 2 Verilog代码 2.1 顶层模块 timescale 1ns / 1ps //以太网传输视频顶层模块module ov5640_udp_pc (input sys_cl…

在WPS表格(Excel)中,每10行增加一个特定的值

注&#xff1a;如下为WPS表格操作演示 例如1&#xff0d;15的数值是1&#xff0c;16-30就变为2&#xff0c;31-45就变为3&#xff0c;类推&#xff01; 1、在B1单元格输入一个起始值&#xff0c;B2单元格输入公式IF(MOD(ROW(),15)0,B11,B1) 然后鼠标放到B2单元格右下角小点处&…

开机弹窗找不到OpenCL.dll是怎么回事,哪种修复方法更推荐

当用户在操作电脑过程中遇到系统提示“OpenCL.dll丢失”时&#xff0c;这究竟是怎么一回事呢&#xff1f;OpenCL.dll&#xff0c;作为Open Computing Language&#xff08;开放计算语言&#xff09;的重要动态链接库文件&#xff0c;它在图形处理器&#xff08;GPU&#xff09;…

springboot整合rabbitmq的不同工作模式详解

前提是已经安装并启动了rabbitmq&#xff0c;并且项目已经引入rabbitmq&#xff0c;完成了配置。 不同模式所需参数不同&#xff0c;生产者可以根据参数不同使用重载的convertAndSend方法。而消费者均是直接监听某个队列。 不同的交换机是实现不同工作模式的关键组件.每种交换…

县供电公司员工向媒体投稿发文章用亲身经历告诉你并不难

在县供电公司的日子里,我肩负着一项至关重要的使命——信息宣传工作。这不仅仅是一份职责,更是连接公司与外界的桥梁,通过新闻稿件传递我们的声音,展示我们的成果。然而,回忆起刚刚踏入这个领域的时光,那段经历至今让我感慨万千。 初涉投稿,步履维艰 刚接手这项工作时,我的投稿…

信息化飞速发展下,源代码防泄密方案该如何选择?常见四种有效方案分享

信息化时代发展迅速&#xff0c;数据防泄露一词也频繁的出现在我们身边。无论企业或政府单位&#xff0c;无纸化办公场景越来越多&#xff0c;数据泄露的时间也层出不穷。例如&#xff1a;世界最大职业中介网站Monster遭到黑客大规模攻击&#xff0c;黑客窃取在网站注册的数百万…

Dockerfile实践java项目

目的&#xff1a;用java项目测试dockerfil部署&#xff08;前提是安装好了docker&#xff09; 部署准备文件如下 1. java项目 java项目demo地址 https://gitee.com/xiaoqu_12/dockerfileDemo.git 或者百度网盘直接下载打包好的jar包 链接&#xff1a;https://pan.baidu.com/s/…

PostgreSQL的学习心得和知识总结(一百四十一)|深入理解PostgreSQL数据库数据库角色的使用及预定义角色的原理

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

【计算机毕业设计】基于SSM++jsp的电子竞技管理平台【源码+lw+部署文档+讲解】

目录 1 绪论 1.1 研究背景 1.2 目的和意义 1.3 论文结构安排 2 相关技术 2.1 SSM框架介绍 2.2 B/S结构介绍 2.3 Mysql数据库介绍 3 系统分析 3.1 系统可行性分析 3.1.1 技术可行性分析 3.1.2 经济可行性分析 3.1.3 运行可行性分析 3.2 系统性能分析 3.2.1 易用性指标 3.2.2 可…

您的浏览器不支持 undefined 代理认证!如有问题请联系您的浏览器支持,请勿反馈此问题给 SwitchyOmega.

一、【问题描述】 PAC 文件是一个 JavaScript 文件&#xff0c;用于定义客户端的代理规则。您可以在 PAC 文件中编写规则&#xff0c;根据不同的目标网址或其他条件&#xff0c;决定是否通过代理服务器进行访问。您可以将 PAC 文件部署到服务器上&#xff0c;并在客户端配置浏…

QT学习PCL库代码

找关键点keypoints 绿色的点就是keypoints outofcore