目录
四、Redis客户端
一、简介
(一)客户端对比:
- jedis:
- 以Redist命令作为方法名称,学习成本低,简单实用。但是Jedis实例是线程不安全的,多线程环境下需要基于连接池来使用。
- lettuce
- Lettuce是基于Netty实现的,支持同步、异步和响应式编程方式,并且是线程安全的。支持Redis的哨兵模式、集群模式和管道模式。
- Redisssion
- Redisson是一个基于Redis实现的分布式、可伸缩的Java数据结构集合。包含了诸如Map、Queue、LockSemaphore、AtomicLong等强大功能
二、Jedis
(一)Jedis简介
- Java语言链接Redis服务
- Jedis
- SpringData Redis
- Lettuce
- 如何将 Java中的数据写入到Redis中
- 如何将Redis中的数据读取到Java中来
(二)HelloWorld(Jedis版)
-
准备工作
-
Jar包导入
下载地址:https://mvnrepository.com/artifact/redis.clients/jedis
-
基于maven
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>jedis-3.6.2</version> </dependency>
-
输出Hello world
-
总共分为三步:
- 创建jedis实例
- 操作jedis数据
- 关闭jedis链接
-
//1.创建jedis实例 Jedis jedis = new Jedis("127.0.0.1", 6379); //2.操作jedis数据 jedis.set("student","zhangsan"); System.out.println(jedis.get("student")); //3.关闭jedis链接 jedis.close();
-
-
(三)Jedis读写Redis数据
基本操作
-
操作list类型数据
jedis.lpush("students","zhangsan","lisi","wangmazi1","zhaoer"); System.out.println(jedis.lrange("students", 0, -1));
-
操作hash数据
HashMap map = new HashMap(); map.put("name","zhangsan"); map.put("age",33); map.put("sex",1); jedis.hset("studentMap",map); System.out.println(jedis.hget("studentMap", "name"));
-
操作set数据
jedis.sadd("studentSet","zhangsan","llsi","wanger"); System.out.println(jedis.smembers
案例:服务调用次数控制
1、案例要求
人工智能领域的语义识号别与自动对话将是未来服务业机器人应答呼叫体系中的重要技术,百度自研用户评价语义识别服务,免费开放给企业试用,同时训练百度自己的模型。现对试用用户的使用行为进行限速,限制每个用户每分钟最多发起10次调用
案列要求:
- 设定A、B、C三个用户
- A用户限制10次/分调用,B用户限制30次/分调用,C用户不限制
2、案例分析
- 设定一个服务方法,用于模拟实际业务调用的服务,内部采用打印模拟调用
- 在业务调用前服务调用控制单元,内部使用rdis进行控制,参照之前的方案
- 对调用超限使用异常进行控制,异常处理设定为打印提示信息
3、代码实现
核心逻辑就是,通过setex设置key的存活时间,通过incr设置增加次数。
public class Service {
String user;
public Service() {
}
public Service(String user) {
this.user = user;
}
public void exeNumber() {
Jedis jedis = new Jedis("127.0.0.1",6379);
String get = jedis.get(user + ":Number");
if (get == null){
jedis.setex(user+":Number",20, String.valueOf(Long.MAX_VALUE-10));
jedis.close();
}else{
try {
Long value = jedis.incr(user + ":Number");
exeService(user,10 - (Long.MAX_VALUE - value));
}catch (JedisDataException ex){
System.out.println(user+"次数已经达到上线请升级会员");
return;
}finally {
jedis.close();
}
}
}
public void exeService(String user, Long num){
System.out.println(user+"执行了,第"+num+"此");
}
}
class MyThread extends Thread{
Service service;
public MyThread(Service service) {
this.service = service;
}
@Override
public void run() {
while (true){
try {
Thread.sleep(200);
service.exeNumber();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class MAIN{
public static void main(String[] args) {
MyThread myThread = new MyThread(new Service("张三"));
myThread.start();
MyThread myThread2 = new MyThread(new Service("李四"));
myThread2.start();
}
}
(四)Jedis工具类&连接池
链接池
在实际开发应用中,不可能手动去管理链接的开启和关闭。
jedis中已经提供好链接池。
- JedisPool:Jedis提供的链接池技术。
- poolConfig:链接池配置对象
- host:redis服务地址
- port:redis服务端口号
代码开发
public class RedisUtils {
static JedisPool jedisPool = null;
static {
ResourceBundle resourceBundle = ResourceBundle.getBundle("jedis");
String host = resourceBundle.getString("jedis.host");
Integer port = Integer.valueOf(resourceBundle.getString("jedis.port"));
Integer maxTotal = Integer.valueOf(resourceBundle.getString("jedis.maxTotal"));
Integer maxIdle = Integer.valueOf(resourceBundle.getString("jedis.maxIdle"));
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(maxTotal);//设置最大连接数
jedisPoolConfig.setMaxIdle(maxIdle);//设置活动连接数
jedisPool = new JedisPool(jedisPoolConfig,host,port);
}
public static Jedis getSouces(){
return jedisPool.getResource();
}
public static void main(String[] args) {
RedisUtils.getSouces();
}
}
(五)可视化客户端工具
两个工具:
- utools
- Redis Desktop Manager
- Redis Viewer
三、SpringDataRedis
(一)简介
SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,官网地址:https://spring.io/projects/spring-data-redis
- 提供了对不同Redis客户端的整合(Lettuce和edis)
- 提供了RedisTemplate统一API来操作Redis
- 支持Redis的发布订阅模型
- 支持Redis哨兵和Redis?集群
- 支持基于Lettuce的响应式编程
- 支持基于引DK、JSON、字符串、Spring对象的数据序列化及反序列化
- 支持基于Redis的DKCollection实现
RedisTemplate工具类
<!-- 引入 redis 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
调用lua脚本
stringRedisTemplate.execute("luascript")