第一章:客户端对比
Redis官网中提供了各种语言的客户端,供我们使用。
我们关注的一定是Java客户端,然而Java的客户端也有N多个,标注*的是推荐使用的。
一:Jedis
Jedis当中的命令命名与redis实际命令一致,学习成本低。但是Jedis实例是线程不安全的,创建一个Jedis实例,多线程需要基于连接池来使用。
二:lettuce
Lettuce是基于Netty实现的,支持同步、异步和响应式变成方式,并且是线程安全的。支持Redis的哨兵模式、集群模式和普通模式。
Spring默认兼容
三:Redisson
Redisson是一个基于Redis实现的分布式、可伸缩的、Java数据结构集合。包含了诸如Map、Queue、Lock、Semaphore、AtomicLong等强大功能。
Spring Data Redis底层兼容了 jedis和lettuce,底层可以无缝切换,这样我们使用即可。Redisson在我们使用分布式锁的时候用的比较多。
第二章 Jedis快速入门
一:添加依赖
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.7.0</version> </dependency>
二:建立链接
private Jedis jedis; @BeforeEach void setUp(){ //建立连接 jedis=new Jedis("192.168.150.101",6379);//redisip地址。 //设置密码 jedis.auth(123321); //选择库 jedis.select(0);//默认就是第一个库 }
三:测试String
@Test void teststring(){ //插入数据,方法名称就是r©dis命令名称,非常简单 String result=jedis.set("name","张三"); System.out.println("result ="result); //获取效据 String name jedis.get("name"); System.out.println("name ="name); }
四:测试哈希
@Test void testHash(){ //插入hash数据 jedis.hset("user:1","name","ack"); jedis.hset("user:1","age","21"); //获取 Map<String,String>map jedis.hgetAll("1"); System.out.println(map);
五:释放资源
4.释放资源 @AfterEach void tearDown(){ //释放瓷源 if (jedis !null){ jedis.close(); }
第三章:Jedis连接池
Jedis本身是线程不安全的。并发条件下通过Jedis操作Redis会出现线程安全问题。
同时,频繁的创建和销毁链接都会有性能损耗,因此我们推荐大家使用Jedis连接池代替Jedis直连的方式。
public class JedisConnectionFactory { private static final JedisPool jedisPool; static { //连接池配置对象。 JedisPoolConfig jedisPoolConfig =new JedisPoolConfig(); //最大连接 jedisPoolConfig.setMaxTotal(8);//最多允许你创建多少个连接 //最大空连接 jedisPoolConfig. setMaxIdle(8);//最大空闲连接,没有人使用这个,最多有8个连接。 //最小空闲连接 jedisPoolConfig.setMinIdle0);//最小空闲连接,超过一段时间之后一直没有人访问,这些连接被释放。 //设置最长等侍时间,ms jedisPoolConfig. setMaxWaitMillis(200);//连接池当中没有连接的时候,是否要等待,默认是-1,也就是一直等待,我们默认等待200ms,超过这个时间,就该报错了。 //连接池对象 jedisPool = new JedisPooljedisPoolConfig("192.168.150.101“,6379, 1000,"123321);//ip+port+超时时间+密码; } } //获取Jedis对象。这是一个静态方法。 public static Jedis getJedis(){ return jedisPool.getResource(); }
通过这个静态方法,大家都从这个池子当中去拿取Jedis对象,基于池化思想,避免了jedis对象的频繁的创建和销毁,节省了计算机资源。
private Jedis jedis; @BeforeEach void setUp(){ //建立连接 jedis=JedisConnectionFactory .getgetJedis(); //设置密码 jedis.auth(123321); //选择库 jedis.select(0);//默认就是第一个库 }
当我们使用池化技术的时候redis.close()就变成了这: