黄东旭解析 TiDB 的核心优势
860
2023-05-20
Redis都要老了,你还在用什么古董客户端?
前几日,Redis 创始人 Antirez 在他的个人博客上宣布将结束自己的 Redis 之旅!
大神累了,Redis老了,但Redis依旧很火。
Redis的Java客户端有很多,比如jedis、redisson、lettuce等。
那大家都在用啥呢?
今天xjjdog做了一个小调查。下面是统计结果。
可以看到jedis以绝对的优势占据了榜首。
下面简单的分析一小下。
jedis
jedis和redis只相差1个字母。我通常把它叫做redis和Java的合体。它有以下特点:
非常的轻量级、简洁,非常方便进行改造和集成支持单机、哨兵、Cluster等部署模式,支持事务、pipeline、LUA脚本等。功能齐全。不支持读写分离,需要自己实现使用了BIO模型,方法调用是同步的jedis客户端实例不是线程安全的,需要使用连接池来使用支持连接池
代码样例。
Jedis jedis = null; try { jedis = pool.getResource(); /// ... do stuff here ... for example jedis.set("foo", "bar"); String foobar = jedis.get("foo"); jedis.zadd("sose", 0, "car"); jedis.zadd("sose", 0, "bike"); Set
redisson
我通常把它叫做redis的儿子。由于是儿子,所以有些功能并不支持。
提供分布式锁等常见的操作封装,并实现了分布式和可扩展的Java数据结构,但不支持一些基础的Redis原生功能基于Netty实现,采用非阻塞IO,性能高。支持异步的请求不支持事务操作,可以使用LUA脚本实现支持在主从部署和cluster部署模式下的读写分离。在此基础上,支持读操作负载均衡api是线程安全的,单个连接可以完成多个操作可以与Spring Session集成实现会话共享支持连接池有中文文档 O__O
代码样例。
// 1. Create config object Config config = new Config(); config.useClusterServers() // use "rediss://" for SSL connection .addNodeAddress("redis://127.0.0.1:7181"); // or read config from file config = Config.fromYAML(new File("config-file.yaml")); // 2. Create Redisson instance // Sync and Async API RedissonClient redisson = Redisson.create(config); // RxJava2 API RedissonRxClient redissonRx = Redisson.createRx(config); // 3. Get Redis based Map RMap
Lettuce
生菜的意思,应该是图腾,因为和我想不起和redis的任何联系。
基于Netty框架的事件驱动的通信层,方法调用也是异步的不需要考虑线程池,性能比较高,Spring生态默认api是线程安全的,单个连接可以完成多个操作同样支持连接池
代码案例。
RedisClient client = RedisClient.create("redis://localhost"); StatefulRedisConnection
小小分析
jedis支持最原生的操作,什么都能干,但是它的表达语义是有限的,可能写了一堆getset,但是还得靠注释来明白这段代码是干啥的。但同时带来的好处就是可塑性强,可以根据自己的需求把它扭成合适的样子。另外,jedis还是BIO的,虽然BIO一般来说都比较慢,但是redis本身就是很快的,不会阻塞很久,这个在普通项目里并没有什么大的问题。
redisson进行了更高级的封装,功能单一,但可以让使用者将精力更集中供暖的放在业务逻辑上 ,封装了很多的轮子。Redisson不仅提供了一系列的分布式Java常用对象,基本可以与Java的基本数据结构通用,还扩展了许多分布式数据结构,其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, Bloom filter, Remote service, Spring cache, Executor service, Live Object service, Scheduler service)。它基于Netty,支持NIO,速度上自然就快一点。我还是通过它实现的一些高级api上知道的它,最著名的就是它的分布式锁,可以像使用Java的可重入锁一样使用它。
Lettuce是生菜的意思,也是Spring的RedisTemplate现在默认的底层实现。比起jedis需要为每个实例创建物理连接来保证线程安全,lettuce确实很优秀。它的性能比较高,支持异步。性能虽然高,但是编程模型比较复杂,不太直观,很多人不太喜欢。
目前来看,大多数项目还在用着BIO的jedis,这没什么问题。jedis的功能齐全,api比较初级好定制,性能也能满足需求。更重要的是,它先入为主,已经成了很多人的标配。
如果在功能上、性能上,已经满足需求,那又有什么理由去换一个新的呢?是闲的蛋疼么?
羞刀难入鞘,傲剑不回锋 ?不存在的。
如果有了Spring封装的这一层,屏蔽了这些蛋疼的切换操作,又有什么理由不换一个快的呢?
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。