Java连接redis的方式是通过jedis,连接redis需要遵循jedis协议。
redis.clients jedis 4.3.1
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 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 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 k52 = jedis.hgetAll("k5"); System.out.println("获取k5的所有键值对:"+k52); } }
适合SSM项目。
public static void main(String[] args) { Set 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")); }
通过starter启动依赖,包含自动装配类,完成相应的装配功能。
org.springframework.boot spring-boot-starter-data-redis
#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
springboot整合redis时封装了两个工具类:StringRedisTemplate和RedisTemplate。
StringRedisTemplate它是RedisTemplate的子类,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 forHash = stringRedisTemplate.opsForHash(); //存放数据 hset(key,field,value) forHash.put("user","name","ykq"); Map 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
它属于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","张三","张三杀回"); } }
#集群模式 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