阅读量:0
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 { @Autowired private StringRedisTemplate stringRedisTemplate; //关于Hash的操作 @Test public 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类对应每种数据类型的操作 对应相应的类来完成 @Test void 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的操作 @Test void 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 { @Autowired private RedisTemplate redisTemplate; @Test public 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 { @Autowired private RedisTemplate redisTemplate; // @Test public 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