引入 Redis

ops/2024/11/14 12:47:49/

简介

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: 123456cluster:# 获取失败 最大重定向次数max-redirects: 3nodes:- 192.168.64.100:6381- 192.168.64.100:6382- 192.168.64.100:6383- 192.168.64.100:6384- 192.168.64.100:6385lettuce:pool:max-active: 8max-wait: -1msmax-idle: 8min-idle: 0cluster: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: 0host: 192.168.64.100port: 6379# 没有密码#password: 123456lettuce:pool:max-active: 8max-wait: -1msmax-idle: 8min-idle: 0
OrderController
@RestController
public class OrderController {@Autowiredprivate 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的子类@Autowiredprivate StringRedisTemplate redisTemplate;@Overridepublic long addOrder() {//生成订单idlong keyId = ThreadLocalRandom.current().nextLong(1000)+1;//生成订单号String orderNo = UUID.randomUUID().toString();redisTemplate.opsForValue().set(ORDER_KEY+keyId,"京东订单"+ orderNo);//实际场景下,是需要往数据库存的,这里省略return keyId;}@Overridepublic 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*/@Beanpublic RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory){RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(lettuceConnectionFactory);//设置key序列化方式stringredisTemplate.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());//keySet<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"));//listSystem.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);}//setjedis.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());//hashjedis.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);}//zsetjedis.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.builderRedisURI 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();//操作命令apiRedisCommands<String,String> commands = conn.sync();//keysList<String> list = commands.keys("*");for(String s : list) {System.out.println("s = " + s);}//Stringcommands.set("k1","1111");String s1 = commands.get("k1");System.out.println("String s ==="+s1);//listcommands.lpush("myList2", "v1","v2","v3");List<String> list2 = commands.lrange("myList2", 0, -1);for(String s : list2) {System.out.println("list ssss==="+s);}//setcommands.sadd("mySet2", "v1","v2","v3");Set<String> set = commands.smembers("mySet2");for(String s : set) {System.out.println("set ssss==="+s);}//hashMap<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));}//zsetcommands.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);}//sortSortArgs 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.ppmy.cn/ops/40770.html

相关文章

STL库具体容器与用法

vector动态数组: 算法&#xff1a;for_each迭代器&#xff1a;vector<int>::iterator 头文件:<vector> 声明&#xff1a;vector<数据类型> 变量名 定义一个整形的vector容器&#xff1a;vector<int> v 迭代器&#xff1a;vector<数据类型>:…

vue3 第二十八节 (vue3 事件循环之JS事件循环)

1、什么是事件循环 事件循环就是消息队列&#xff0c;是浏览器渲染主线程的工作方式&#xff1b; 过去将消息队列&#xff0c;简单的分为宏任务 和微任务 两种队列&#xff0c;而对于现在复杂多变的浏览器环境&#xff0c;显然这种处理方式已经不能满足使用&#xff0c;取而代…

ubuntu22 安装ROS2

1.设置编码 sudo apt update sudo apt install locales sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALLen_US.UTF-8 LANGen_US.UTF-8 export LANGen_US.UTF-82.使能代码库 sudo apt install software-properties-common sudo add-apt-repository universe3.现…

Docker 快速安装指南 (CentOS 7)

Docker 快速安装指南 (CentOS 7) 1. 更新现有的软件包 sudo yum update -y2. 安装必要的依赖包 sudo yum install -y yum-utils device-mapper-persistent-data lvm2yum-utils: 提供 yum-config-manager 工具&#xff0c;方便添加软件仓库。device-mapper-persistent-data 和…

Springboot集成Mybatispuls操作mysql数据库-04

MyBatis-Plus&#xff08;简称MP&#xff09;是一个MyBatis的增强工具&#xff0c;在MyBatis的基础上只做增强而不做改变。它支持所有MyBatis原生的特性&#xff0c;因此引入MyBatis-Plus不会对现有的MyBatis构架产生任何影响。MyBatis-Plus旨在简化开发、提高效率&#xff0c;…

TCP(TCP客户端、服务器如何通信)

一、TCP介绍 TCP的特点&#xff1a; 面向连接的协议&#xff1a;TCP是一种可靠的、面向连接的协议&#xff0c;在通信之前需要建立连接&#xff0c;以确保数据的可靠传输。这意味着在传输数据之前&#xff0c;发送方和接收方之间需要建立一条可靠的连接通道。流式协议&#x…

Redis常用语法命令及使用示例详解

点击下载《Redis常用语法命令及使用示例详解》 Redis 是一个开源的内存数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中介。它支持多种类型的数据结构&#xff0c;如字符串、哈希、列表、集合、有序集合等类型&#xff0c;并且提供了丰富的命令来进行数据的增删改…

MySQL 数据库事务 ACID 特性

什么是数据库事务 将一些对数据库的操作组成一个集合&#xff0c;这个集合就是事务。事务的特点&#xff0c;包含在内的操作要么都执行&#xff0c;要么都失败。 关于事务经典的问题就是金融转账了&#xff0c;小明要向小红转账1000元&#xff0c;转账的过程中包含了以下操作…