当前位置: 首页 > news >正文

把redis用在Java项目

1. Java连接redis

Java连接redis的方式是通过jedis,连接redis需要遵循jedis协议。

1.1 引入依赖

<!--引入java连接redis的驱动--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.1</version></dependency>

 1.2 编写代码

import redis.clients.jedis.Jedis;import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class Test01 {public static void main(String[] args) {//连接redis的信息 默认连接本地的redis 端口号6379. 所有关于redis操作的功能都在该类中Jedis jedis=new Jedis("192.168.111.188",6379);//关于key的命令Set<String> keys = jedis.keys("*");System.out.println("所有的key:"+keys);long del = jedis.del("k1", "k2", "k3");System.out.println("删除key的个数:"+del);boolean k4 = jedis.exists("k4");System.out.println("判断指定的k4是否存在:"+k4);long k5 = jedis.expire("k5", 10);//关于字符串类型的命令:String set = jedis.set("k1", "v1");System.out.println("存入k1的值:"+set);String k1 = jedis.get("k1");System.out.println("获取指定key的值:"+k1);long k2 = jedis.setnx("k2", "110");System.out.println("如果k2不存在,则设置k2的值:"+k2);long k21 = jedis.incr("k2");System.out.println("k2的值加1:"+k21);long k22 = jedis.decr("k2");System.out.println("k2的值减1:"+k22);String setex = jedis.setex("k3", 100, "v3");System.out.println("k3的值:"+setex);//关于hash类型的命令:long hset = jedis.hset("k4", "k41", "v41");System.out.println("存入k4的键值对:"+hset);Map<String,String> map=new HashMap<>();map.put("name","张三");map.put("age","18");long k51 = jedis.hset("k5", map);System.out.println("存入k5的键值对:"+k51);String hget = jedis.hget("k5", "name");System.out.println("获取k5的name的值:"+hget);Map<String, String> k52 = jedis.hgetAll("k5");System.out.println("获取k5的所有键值对:"+k52);}
}

2. java连接redis集群模式

适合SSM项目。

  public static void main(String[] args) {Set<HostAndPort> nodes=new HashSet<>();nodes.add(new HostAndPort("192.168.111.188",7001));nodes.add(new HostAndPort("192.168.111.188",7002));nodes.add(new HostAndPort("192.168.111.188",7003));nodes.add(new HostAndPort("192.168.111.188",7004));nodes.add(new HostAndPort("192.168.111.188",7005));nodes.add(new HostAndPort("192.168.111.188",7006));JedisCluster jedisCluster=new JedisCluster(nodes);jedisCluster.set("k5","666");System.out.println(jedisCluster.get("k5"));}

3. springboot整合redis

通过starter启动依赖,包含自动装配类,完成相应的装配功能。

3.1 引入依赖

 <!--引入了redis整合springboot 的依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

 3.2 修改配置文件

#redis 配置
#你所连接的reids的地址
spring.redis.host=192.168.111.188
#端口号
spring.redis.port=6379
#连接的几号数据库
spring.redis.database=1
#用于控制 Jedis 连接池的一个属性。它定义了连接池中可以同时活动的最大连接数。
spring.redis.jedis.pool.max-active=100
#用于设置 Jedis 连接池中最多可以有多少个空闲的 Redis 连接
spring.redis.jedis.pool.max-idle=10
#用于设置当连接池中的所有连接都在使用时,线程等待连接池返回连接的最大时间
spring.redis.jedis.pool.max-wait=10000ms

 3.3 使用

springboot整合redis时封装了两个工具类:StringRedisTemplate和RedisTemplate

StringRedisTemplate它是RedisTemplate的子类,StringRedisTemplate里面只能存放字符串的内容。

3.3.1 StringRedisTemplate


import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;@SpringBootTest
class Qy174SpringbootRedisApplicationTests {@Autowiredprivate StringRedisTemplate stringRedisTemplate;//关于Hash的操作@Testpublic void testHash(){HashOperations<String, Object, Object> forHash = stringRedisTemplate.opsForHash();//存放数据  hset(key,field,value)forHash.put("user","name","ykq");Map<String,String> map=new HashMap<>();map.put("age","18");map.put("adrress","北京");forHash.putAll("user",map);//获取指定的元素  hget(key,field)Object o = forHash.get("user", "name");System.out.println("获取指定的元素:"+o);Map<Object, Object> user = forHash.entries("user");System.out.println("获取所有的元素:"+user);Set<Object> user1 = forHash.keys("user");System.out.println("获取所有的key:"+user1);List<Object> user2 = forHash.values("user");System.out.println("获取所有的value:"+user2);}//关于String的操作: 在封装的StringRedisTemplate类对应每种数据类型的操作 对应相应的类来完成@Testvoid testString() {//得到操作字符串的类对象ValueOperations<String, String> opsForValue = stringRedisTemplate.opsForValue();//存放数据---set(k,v)opsForValue.set("k1","v1");//存放数据--setex(k,second,v)opsForValue.set("k2","20",2,TimeUnit.MINUTES);//存放数据--setnx(k,v)Boolean aBoolean = opsForValue.setIfAbsent("k3", "v3", 2, TimeUnit.MINUTES);System.out.println("是否设置成功:"+aBoolean);//获取指定的元素String k1 = opsForValue.get("k1");System.out.println("获取指定的元素:"+k1);Long k2 = opsForValue.increment("k2", 10);System.out.println("获取指定的元素:"+k2);}//关于key的操作@Testvoid testKeys() {Set<String> keys = stringRedisTemplate.keys("*");System.out.println("所有的key:"+keys);Boolean k1 = stringRedisTemplate.delete("k1");System.out.println("是否删除指定的k1:"+k1);Boolean k11 = stringRedisTemplate.hasKey("k1");System.out.println("是否存在k1:"+k11);Boolean k12 = stringRedisTemplate.expire("k1", 10, TimeUnit.HOURS);System.out.println("是否设置过期时间:"+k12);}}

3.3.2 RedisTemplate

它属于StringRedisTemplate的父类,它的泛型默认都是Object。它可以直接存储任意类型的key和value。

@SpringBootTest
class Qy174SpringbootRedisApplicationTests {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void test01(){//指定key的序列化方式。redisTemplate.setKeySerializer(new StringRedisSerializer());//指定value的序列化方式redisTemplate.setValueSerializer(new FastJsonRedisSerializer<>(Object.class));ValueOperations valueOperations = redisTemplate.opsForValue();valueOperations.set("k11","v11"); //为什么出现了乱码?1.key要不要序列化。要。默认使用的是jdk序列化方式 。System.out.println(valueOperations.get("k11"));//能否获取值。--能//org.springframework.data.redis.serializer.SerializationException: 序列化valueOperations.set("k12",new User("宋英豪",18));//把内存中的数据存入磁盘---序列化过程JSONObject k12 = (JSONObject) valueOperations.get("k12");}}

如果使用RedisTemplate每次都需要人为指定key和value的序列化。

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.support.spring.FastJsonRedisSerializer;
import com.ykq.demos.web.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.serializer.StringRedisSerializer;import java.util.*;
import java.util.concurrent.TimeUnit;@SpringBootTest
class Qy174SpringbootRedisApplicationTests {@Autowiredprivate RedisTemplate redisTemplate;     //@Testpublic void test01(){ValueOperations valueOperations = redisTemplate.opsForValue();valueOperations.set("k11","v11"); //为什么出现了乱码?1.key要不要序列化。要。默认使用的是jdk序列化方式 。System.out.println(valueOperations.get("k11"));//能否获取值。--能//org.springframework.data.redis.serializer.SerializationException: 序列化valueOperations.set("k12",new User("宋英豪",18));//把内存中的数据存入磁盘---序列化过程JSONObject k12 = (JSONObject) valueOperations.get("k12");HashOperations forHash = redisTemplate.opsForHash();forHash.put("u","n","zhangsan");forHash.put("u","张三","张三杀回");}}

4. 集群模式

#集群模式
spring.redis.cluster.nodes=192.168.111.188:7006,192.168.111.188:7001,192.168.111.188:7002,192.168.111.188:7003,192.168.111.188:7004,192.168.111.188:7005

http://www.lryc.cn/news/408742.html

相关文章:

  • GORM:优雅的Go语言ORM库
  • Golang | Leetcode Golang题解之第279题完全平方数
  • Oracle系统表空间的加解密
  • pytorch backbone
  • uniapp 开发app使用renderjs操作dom
  • 【面试题】MySQL `EXPLAIN`的`Extra`字段:深入解析查询优化的隐藏信息
  • Jenkins持续部署
  • 橙单前端项目下载编译遇到的问题与解决
  • 在android中怎么处理后端返回列表中包含图片id,如何将列表中的图片id转化成url
  • IM聊天代码
  • 【Go - context 速览,场景与用法】
  • Linus: vim编辑器的使用,快捷键及配置等周边知识详解
  • 数仓作业延时告警-基于关键路径预推
  • 秋招复习笔记——八股文部分:网络TCP
  • 麒麟桌面操作系统上配置Samba
  • 【Go】探索 Go 语言的内建函数 copy
  • 【React】JSX:从基础语法到高级用法的深入解析
  • JMeter 使用
  • 20240724----安装git和配置git的环境变量/如何用命令git项目到本地idea
  • JavaScript实战 - 用Canvas画一个心形
  • vim gcc
  • Symfony 表单构建器:创建和管理表单的最佳实践
  • Intel电脑CPU的选择
  • MySQL字段设置的varchar长度小于数据长度自动截取丢弃超出的长度而不是报错?
  • Linux|多线程(三)
  • 智能合约中如何返回mapping
  • nginx的学习(二):负载均衡和动静分离
  • 普中51单片机:DS1302时钟芯片讲解与应用(十)
  • Preact:轻量级替代React的选择
  • 全栈嵌入式C++、STM32、Modbus、FreeRTOS和MQTT协议:工业物联网(IIoT)可视化系统设计思路(附部分代码解析)