本文转载自微信公众号「小姐姐味道」,作者小姐姐养的客户狗。转载本文请联系小姐姐味道公众号。都端
前几日,老还Redis 古董创始人 Antirez 在他的个人博客上宣布将结束自己的 Redis 之旅!
[[332526]]
大神累了,Redis老了,客户但Redis依旧很火。都端
Redis的老还Java客户端有很多,比如jedis、古董redisson、客户lettuce等。都端
那大家都在用啥呢?老还
今天xjjdog做了一个小调查。下面是古董统计结果。
可以看到jedis以绝对的优势占据了榜首。
下面简单的分析一小下。
jedis
jedis和redis只相差1个字母。我通常把它叫做redis和Java的合体。它有以下特点:
代码样例。
- 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<String> sose = jedis.zrange("sose", 0, -1);
- } finally {
- // You have to close jedis object. If you don't close then
- // it doesn't release back to pool and you can't get a new
- // resource from pool.
- if (jedis != null) {
- jedis.close();
- }
- }
- /// ... when closing your application:
- pool.close();
redisson
我通常把它叫做redis的儿子。由于是儿子,所以有些功能并不支持。
代码样例。
- // 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<MyKey, MyValue> map = redisson.getMap("myMap");
- RMapReactive<MyKey, MyValue> mapReactive = redissonReactive.getMap("myMap");
- RMapRx<MyKey, MyValue> mapRx = redissonRx.getMap("myMap");
- // 4. Get Redis based Lock
- RLock lock = redisson.getLock("myLock");
- RLockReactive lockReactive = redissonReactive.getLock("myLock");
- RLockRx lockRx = redissonRx.getLock("myLock");
Lettuce
生菜的意思,应该是图腾,因为和我想不起和redis的任何联系。
代码案例。
- RedisClient client = RedisClient.create("redis://localhost");
- StatefulRedisConnection<String, String> connection = client.connect();
- RedisStringCommands sync = connection.sync();
- String value = sync.get("key");
- ////////////////////
- StatefulRedisConnection<String, String> connection = client.connect();
- RedisStringAsyncCommands<String, String> async = connection.async();
- RedisFuture<String> set = async.set("key", "value")
- RedisFuture<String> get = async.get("key")
- async.awaitAll(set, get) == true
- set.get() == "OK"
- get.get() == "value"
小小分析
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封装的这一层,屏蔽了这些蛋疼的切换操作,又有什么理由不换一个快的呢?
作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。
责任编辑:武晓燕 来源: 小姐姐味道 RedisJedisJava
(责任编辑:时尚)
中国金融投资管理(00605.HK)公布消息:将考虑向罗锐及关雪玲提起法律诉讼
中青旅(600138.SH):2020年度由盈转亏 基本每股亏损0.3206元
穷游2018出境游大数据报告:小众目的地崛起,年轻旅行者渐成主力军
中国电信 5G 卫星双模手机:天翼铂顿 S9 官宣 11 月 10 日发布
*ST康得(002450.SZ)2020年度实现归母净亏损32.05亿元 公司总资产81.01亿元
更香了 努比亚Z50S Pro追加24GB+1TB版本 售价4699元