当前位置: 首页 > 科技观察

Redis老了,你还在用什么古董客户端?

时间:2023-03-16 19:20:14 科技观察

本文转载自微信公众号“小姐姐的味道”,作者小姐姐养的狗。转载本文请联系味觉小姐公众号。日前,Redis创始人Antirez在个人博客上宣布结束Redis之旅!大神累了,Redis老了,但是Redis还是很火的。Redis的Java客户端有很多,比如jedis、redisson、lettuce等,那你用的是什么?今天xjjdog做了个小调查。以下是统计数据。可见,绝地武士以绝对优势占据榜首。下面简单分析一下。jedisjedis和redis仅相差1个字母。我通常称它为redis和Java的组合。它具有以下特点:非常轻量、简洁,非常方便改造和集成。支持单机、哨兵、集群等部署模式,支持事务、管道、LUA脚本。功能齐全。不支持读写分离,需要自己实现使用BIO模型,方法调用是同步的jedis客户端实例不是线程安全的,需要使用连接池才能使用支持连接池代码示例.Jedisjedis=null;try{jedis=pool.getResource();///...dostuffhere...forexamplejedis.set("foo","bar");Stringfoobar=jedis.get("foo");jedis。zadd("sose",0,"car");jedis.zadd("sose",0,"bike");Setsose=jedis.zrange("sose",0,-1);}最后{//Youhavetoclosejedisobject.Ifyoudon'tclosethen//itdoes'releasebacktopoolandyoucan'tgetanew//resourcefrompool.if(jedis!=null){jedis.close();}}///...whenclosingyourapplication:pool.close();redisson我通常称它为redis之子。因为是儿子,所以有些功能是不支持的。提供分布式锁等常用操作包,实现分布式、可扩展的Java数据结构,但不支持一些基本的Redis原生功能。基于Netty,使用非阻塞IO,具有高性能。支持异步请求,不支持事务操作,可以使用LUA脚本实现,支持主从和集群部署模式下的读写分离。在此基础上,支持读操作的负载均衡。api是线程安全的,一个连接可以完成多个操作。可以与SpringSession集成,实现会话共享。它支持连接池。有中文文档O__O代码示例。//1.CreateconfigobjectConfigconfig=newConfig();config.useClusterServers()//使用"rediss://"forSSLconnection.addNodeAddress("redis://127.0.0.1:7181");//或者readconfigfromfileconfig=Config.fromYAML(newFile("config-file.yaml"));//2.CreateRedissoninstance//SyncandAsyncAPIRedissonClientredisson=Redisson.create(config);//RxJava2APIRedissonRxClientredissonRx=Redisson.createRx(config);//3.GetRedisbasedMapRMapmap=redisson.getMap("myMap");RMapReactivemapReactive=redissonReactive.getMap("myMap");RMapRxmapRx=redissonRx.getMap("myMap");//4.GetRedisbasedLockRLocklock=redisson.getLock("myLock");RLockReactivelockReactive=redissonReactive.getLock("myLock");RLockRxlockRx=redissonRx.getLock("myLock");Lettuce生菜的意思应该是图腾,因为我想不出和redis有什么联系。基于Netty框架的事件驱动通信层,方法调用也是异步的。不需要考虑线程池,性能比较高。Spring生态默认的api是线程安全的,一个连接可以完成多个操作。它还支持连接池代码案例。RedisClientclient=RedisClient.create("redis://localhost");StatefulRedisConnectionconnection=client.connect();RedisStringCommandssync=connection.sync();Stringvalue=sync.get("key");///////////////////StatefulRedisConnectionconnection=client.connect();RedisStringAsyncCommandsasync=connection.async();RedisFutureset=async.set("key","value")RedisFutureget=async.get("key")async.awaitAll(set,get)==trueset.get()=="确定"得到。get()=="value"小解析jedis支持大部分native操作,可以做任何事情,但是它的表达语义是有限的,可能会写一堆getsets,但是你要靠注释来理解这段代码在干什么或者某物。但同时它的优点是可塑性强,可以根据自己的需要将其拧成合适的形状。另外,绝地武士还是BIO。BIO虽然普遍比较慢,但是redis本身很快,不会长时间阻塞。这在普通项目中问题不大。Redisson进行了更高级的封装,功能单一,但让用户更专注于业务逻辑,封装了很多轮子。Redisson不仅提供了一系列分布式Java通用对象,基本上可以和Java的基本数据结构通用,还扩展了很多分布式数据结构,包括(BitSet,Set,Multimap,SortedSet,Map,List,Queue,BlockingQueue,Deque,BlockingDeque,Semaphore,Lock,AtomicLong,CountDownLatch,Publish/Subscribe,Bloomfilter,Remoteservice,Springcache,Executorservice,LiveObjectservice,Schedulerservice)。它基于Netty,支持NIO,速度自然更快。我还是通过它实现的一些高级API知道它的,最著名的就是它的分布式锁,可以像Java的可重入锁一样使用。Lettuce是生菜的意思,也是Spring默认的RedisTemplate底层实现。相对于jedis需要为每个实例创建一个物理连接来保证线程安全,lettuce确实是优秀的。性能比较高,支持异步。虽然性能高,但是编程模型比较复杂,不直观,很多人不喜欢。目前大部分项目还在用BIO的jedis,没问题。Jedis功能齐全,api比较初级,易于定制,性能可以满足需求。更重要的是,它先入为主,成为了很多人的标配。如果在功能和性能方面都已经满足要求,那还有什么理由去换新的呢?是不是很头疼?羞难入鞘,傲剑不回锋?它不存在。如果有Spring的这一层封装,把这些痛苦的切换操作屏蔽掉,何不换一个更快的呢?作者简介:品味小姐姐(xjjdog),一个不允许程序员走弯路的公众号。专注于基础架构和Linux。十年架构,每天百亿流量,与你探讨高并发世界,给你不一样的滋味。