当前位置: 首页 > news >正文

公司宣传册怎么制作长春做网站公司长春seo公司

公司宣传册怎么制作,长春做网站公司长春seo公司,帝国网站 教程,深圳定制网站制作摘要 是 Redis 的一款高级 Java 客户端,已成为 SpringBoot 2.0 版本默认的 redis 客户端。Lettuce 后起之秀,不仅功能丰富,提供了很多新的功能特性,比如异步操作、响应式编程等,还解决了 Jedis 中线程不安全的问题。 …

摘要

    是 Redis 的一款高级 Java 客户端,已成为 SpringBoot 2.0 版本默认的 redis 客户端。Lettuce 后起之秀,不仅功能丰富,提供了很多新的功能特性,比如异步操作、响应式编程等,还解决了 Jedis 中线程不安全的问题。

Lettuce

    <dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId><version>6.2.5.RELEASE</version></dependency>

同步操作

基本上 Jedis 支持的同步命令操作,Lettuce 都支持。

Lettuce 的 api 操作如下!

public class LettuceUtil {public static void main(String[] args) {RedisURI redisUri = RedisURI.builder().withHost("127.0.0.1").withPort(6379).withPassword("111111").withTimeout(Duration.of(10, ChronoUnit.SECONDS)).build();RedisClient redisClient = RedisClient.create(redisUri);StatefulRedisConnection<String, String> connection = redisClient.connect();//获取同步操作命令工具RedisCommands<String, String> commands = connection.sync();System.out.println("清空数据:"+commands.flushdb());System.out.println("判断某个键是否存在:"+commands.exists("username"));System.out.println("新增<'username','xmr'>的键值对:"+commands.set("username", "xmr"));System.out.println("新增<'password','password'>的键值对:"+commands.set("password", "123"));System.out.println("获取<'password'>键的值:"+commands.get("password"));System.out.println("系统中所有的键如下:" + commands.keys("*"));System.out.println("删除键password:"+commands.del("password"));System.out.println("判断键password是否存在:"+commands.exists("password"));System.out.println("设置键username的过期时间为5s:"+commands.expire("username", 5L));System.out.println("查看键username的剩余生存时间:"+commands.ttl("username"));System.out.println("移除键username的生存时间:"+commands.persist("username"));System.out.println("查看键username的剩余生存时间:"+commands.ttl("username"));System.out.println("查看键username所存储的值的类型:"+commands.type("username"));connection.close();redisClient.shutdown();}
}

异步操作

Lettuce 还支持异步操作,将上面的操作改成异步处理,结果如下!

public class LettuceUtil {public static void main(String[] args) throws Exception {RedisURI redisUri = RedisURI.builder().withHost("127.0.0.1").withPort(6379).withPassword("111111").withTimeout(Duration.of(10, ChronoUnit.SECONDS)).build();RedisClient redisClient = RedisClient.create(redisUri);StatefulRedisConnection<String, String> connection = redisClient.connect();//获取异步操作命令工具RedisAsyncCommands<String, String> commands = connection.async();System.out.println("清空数据:"+commands.flushdb().get());System.out.println("判断某个键是否存在:"+commands.exists("username").get());System.out.println("新增<'username','xmr'>的键值对:"+commands.set("username", "xmr").get());System.out.println("新增<'password','password'>的键值对:"+commands.set("password", "123").get());System.out.println("获取<'password'>键的值:"+commands.get("password").get());System.out.println("系统中所有的键如下:" + commands.keys("*").get());System.out.println("删除键password:"+commands.del("password").get());System.out.println("判断键password是否存在:"+commands.exists("password").get());System.out.println("设置键username的过期时间为5s:"+commands.expire("username", 5L).get());System.out.println("查看键username的剩余生存时间:"+commands.ttl("username").get());System.out.println("移除键username的生存时间:"+commands.persist("username").get());System.out.println("查看键username的剩余生存时间:"+commands.ttl("username").get());System.out.println("查看键username所存储的值的类型:"+commands.type("username").get());connection.close();redisClient.shutdown();}
}

响应式编程

        Lettuce 除了支持异步编程以外,还支持响应式编程,Lettuce 引入的响应式编程框架是Project Reactor,如果没有响应式编程经验可以先自行了解一下,访问地址https://projectreactor.io/

响应式编程使用案例如下:

public class LettuceUtil {public static void main(String[] args) throws Exception {RedisURI redisUri = RedisURI.builder().withHost("127.0.0.1").withPort(6379).withPassword("111111").withTimeout(Duration.of(10, ChronoUnit.SECONDS)).build();RedisClient redisClient = RedisClient.create(redisUri);StatefulRedisConnection<String, String> connection = redisClient.connect();//获取响应式API操作命令工具RedisReactiveCommands<String, String> commands = connection.reactive();Mono<String> setc = commands.set("name", "mayun");System.out.println(setc.block());Mono<String> getc = commands.get("name");getc.subscribe(System.out::println);Flux<String> keys = commands.keys("*");keys.subscribe(System.out::println);//开启一个事务,先把count设置为1,再将count自增1commands.multi().doOnSuccess(r -> {commands.set("count", "1").doOnNext(value -> System.out.println("count1:" +  value)).subscribe();commands.incr("count").doOnNext(value -> System.out.println("count2:" +  value)).subscribe();}).flatMap(s -> commands.exec()).doOnNext(transactionResult -> System.out.println("transactionResult:" + transactionResult.wasDiscarded())).subscribe();Thread.sleep(1000 * 5);connection.close();redisClient.shutdown();}
}

发布和订阅

        Lettuce 还支持 redis 的消息发布和订阅,具体实现案例如下:

public class LettuceUtil {public static void main(String[] args) throws Exception {RedisURI redisUri = RedisURI.builder().withHost("127.0.0.1").withPort(6379).withPassword("111111").withTimeout(Duration.of(10, ChronoUnit.SECONDS)).build();RedisClient redisClient = RedisClient.create(redisUri);//获取发布订阅操作命令工具StatefulRedisPubSubConnection<String, String> pubsubConn = redisClient.connectPubSub();pubsubConn.addListener(new RedisPubSubListener<String, String>() {@Overridepublic void unsubscribed(String channel, long count) {System.out.println("[unsubscribed]" + channel);}@Overridepublic void subscribed(String channel, long count) {System.out.println("[subscribed]" + channel);}@Overridepublic void punsubscribed(String pattern, long count) {System.out.println("[punsubscribed]" + pattern);}@Overridepublic void psubscribed(String pattern, long count) {System.out.println("[psubscribed]" + pattern);}@Overridepublic void message(String pattern, String channel, String message) {System.out.println("[message]" + pattern + " -> " + channel + " -> " + message);}@Overridepublic void message(String channel, String message) {System.out.println("[message]" + channel + " -> " + message);}});RedisPubSubAsyncCommands<String, String> pubsubCmd = pubsubConn.async();pubsubCmd.psubscribe("CH");pubsubCmd.psubscribe("CH2");pubsubCmd.unsubscribe("CH");Thread.sleep(100 * 5);pubsubConn.close();redisClient.shutdown();}
}

客户端资源与参数配置

        Lettuce 客户端的通信框架集成了 Netty 的非阻塞 IO 操作,客户端资源的设置与 Lettuce 的性能、并发和事件处理紧密相关,如果不是特别熟悉客户端参数配置,不建议在没有经验的前提下凭直觉修改默认值,保持默认配置就行。

        非集群环境下,具体的配置案例如下:

public class LettuceUtil {public static void main(String[] args) throws Exception {ClientResources resources = DefaultClientResources.builder().ioThreadPoolSize(4) //I/O线程数.computationThreadPoolSize(4) //任务线程数.build();RedisURI redisUri = RedisURI.builder().withHost("127.0.0.1").withPort(6379).withPassword("111111").withTimeout(Duration.of(10, ChronoUnit.SECONDS)).build();ClientOptions options = ClientOptions.builder().autoReconnect(true)//是否自动重连.pingBeforeActivateConnection(true)//连接激活之前是否执行PING命令.build();RedisClient client = RedisClient.create(resources, redisUri);client.setOptions(options);StatefulRedisConnection<String, String> connection = client.connect();RedisCommands<String, String> commands = connection.sync();commands.set("name", "xxxx");System.out.println(commands.get("name"));connection.close();client.shutdown();resources.shutdown();}
}

        集群环境下,具体的配置案例如下:

public class LettuceMain {public static void main(String[] args) throws Exception {ClientResources resources = DefaultClientResources.builder().ioThreadPoolSize(4) //I/O线程数.computationThreadPoolSize(4) //任务线程数.build();RedisURI redisUri = RedisURI.builder().withHost("192.168.221.11").withPort(6379).withPassword("111111").withTimeout(Duration.of(10, ChronoUnit.SECONDS)).build();ClusterClientOptions options = ClusterClientOptions.builder().autoReconnect(true)//是否自动重连.pingBeforeActivateConnection(true)//连接激活之前是否执行PING命令.validateClusterNodeMembership(true)//是否校验集群节点的成员关系.build();RedisClusterClient client = RedisClusterClient.create(resources, redisUri);client.setOptions(options);StatefulRedisClusterConnection<String, String> connection = client.connect();RedisAdvancedClusterCommands<String, String> commands = connection.sync();commands.set("name", "goodss");System.out.println(commands.get("name"));connection.close();client.shutdown();resources.shutdown();}
}

线程池配置

        Lettuce 连接设计的时候,就是线程安全的,所以一个连接可以被多个线程共享,同时 lettuce 连接默认是自动重连的,使用单连接基本可以满足业务需求,大多数情况下不需要配置连接池,多连接并不会给操作带来性能上的提升。

但在某些特殊场景下,比如事物操作,使用连接池会是一个比较好的方案,那么如何配置线程池呢?

public class LettuceUtil {public static void main(String[] args) throws Exception {RedisURI redisUri = RedisURI.builder().withHost("192.168.221.11").withPort(6379).withPassword("111111").withTimeout(Duration.of(10, ChronoUnit.SECONDS)).build();RedisClient client = RedisClient.create(redisUri);//连接池配置GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();poolConfig.setMaxIdle(2);GenericObjectPool<StatefulRedisConnection<String, String>> pool = ConnectionPoolSupport.createGenericObjectPool(client::connect, poolConfig);StatefulRedisConnection<String, String> connection = pool.borrowObject();RedisCommands<String, String> commands = connection.sync();commands.set("name", "llkd");System.out.println(commands.get("name"));connection.close();pool.close();client.shutdown();}
}

主从模式配置

        redis 一般采用主从复制模式,搭建高可用的架构,简单的说就一个主节点,多个从节点,自动从主节点同步最新数据。

        Lettuce 支持自动发现主从模式下的节点信息,然后保存到本地,具体配置如下:

public class LettuceUtil {public static void main(String[] args) throws Exception {//这里只需要配置一个节点的连接信息,不一定需要是主节点的信息,从节点也可以;可以自动发现主从节点RedisURI uri = RedisURI.builder().withHost("192.168.221.11").withPort(6379).withPassword("123456").build();RedisClient client = RedisClient.create(uri);StatefulRedisMasterReplicaConnection<String, String> connection = MasterReplica.connect(client, StringCodec.UTF8, uri);//从节点读取数据connection.setReadFrom(ReadFrom.REPLICA);RedisCommands<String, String> commands = connection.sync();commands.set("name", "张飞");System.out.println(commands.get("name"));connection.close();client.shutdown();}
}

        当然我们也可以手动指定集群节点来加载,具体配置如下:

public class LettuceMain {public static void main(String[] args) throws Exception {//集群节点List<RedisURI> uris = new ArrayList();uris.add(RedisURI.builder().withHost("192.168.221.14").withPort(7000).withPassword("123456").build());uris.add(RedisURI.builder().withHost("192.168.221.15").withPort(7000).withPassword("123456").build());uris.add(RedisURI.builder().withHost("192.168.221.16").withPort(7001).withPassword("123456").build());RedisClient client = RedisClient.create();StatefulRedisMasterReplicaConnection<String, String> connection = MasterReplica.connect(client, StringCodec.UTF8, uris);//从节点读取数据connection.setReadFrom(ReadFrom.REPLICA);RedisCommands<String, String> commands = connection.sync();commands.set("name", "张飞");System.out.println(commands.get("name"));connection.close();client.shutdown();}
}

哨兵模式配置

        哨兵模式,也是 redis 实现服务高可用的一大亮点,具体配置实现如下:

public class LettuceUtil {public static void main(String[] args) throws Exception {//集群节点List<RedisURI> uris = new ArrayList();uris.add(RedisURI.builder().withHost("192.168.221.11").withPort(7000).withPassword("123456").build());uris.add(RedisURI.builder().withHost("192.168.221.12").withPort(7000).withPassword("123456").build());uris.add(RedisURI.builder().withHost("192.168.221.13").withPort(7000).withPassword("123456").build());RedisClient client = RedisClient.create();StatefulRedisMasterReplicaConnection<String, String> connection = MasterReplica.connect(client, StringCodec.UTF8, uris);//从节点读取数据connection.setReadFrom(ReadFrom.REPLICA);RedisCommands<String, String> commands = connection.sync();commands.set("name", "dddown");System.out.println(commands.get("name"));connection.close();client.shutdown();}
}

Cluster 集群模式配置

        Cluster 集群模式,是之后推出的一种高可用的架构模型,主要是采用分片方式来存储数据,具体配置如下:

public class LettuceUtil {public static void main(String[] args) throws Exception {Set<RedisURI> uris = new HashSet<>();uris.add(RedisURI.builder().withHost("192.168.221.11").withPort(7000).withPassword("123456").build());uris.add(RedisURI.builder().withHost("192.168.221.12").withPort(7000).withPassword("123456").build());uris.add(RedisURI.builder().withHost("192.168.221.13").withPort(7000).withPassword("123456").build());uris.add(RedisURI.builder().withHost("192.168.221.14").withPort(7000).withPassword("123456").build());uris.add(RedisURI.builder().withHost("192.168.221.15").withPort(7000).withPassword("123456").build());uris.add(RedisURI.builder().withHost("192.168.221.16").withPort(7001).withPassword("123456").build());RedisClusterClient client = RedisClusterClient.create(uris);StatefulRedisClusterConnection<String, String> connection = client.connect();RedisAdvancedClusterCommands<String, String> commands = connection.sync();commands.set("name", "uuup");System.out.println(commands.get("name"));//选择从节点,只读NodeSelection<String, String> replicas = commands.replicas();NodeSelectionCommands<String, String> nodeSelectionCommands = replicas.commands();Executions<List<String>> keys = nodeSelectionCommands.keys("*");keys.forEach(key -> System.out.println(key));connection.close();client.shutdown();}
}

小结

        Lettuce 作为 Jedis 客户端,功能更加强大,不仅解决了线程安全的问题,还支持异步和响应式编程,支持集群,Sentinel,管道和编码器等等功能。


文章转载自:
http://dinncounstiffen.wbqt.cn
http://dinncocontingencies.wbqt.cn
http://dinncohorseweed.wbqt.cn
http://dinncoprivatism.wbqt.cn
http://dinncounproportionate.wbqt.cn
http://dinncoinfall.wbqt.cn
http://dinncoweirdly.wbqt.cn
http://dinncoadsuki.wbqt.cn
http://dinncooracy.wbqt.cn
http://dinncovomitus.wbqt.cn
http://dinncosuedehead.wbqt.cn
http://dinncoconceptualise.wbqt.cn
http://dinncoconceivable.wbqt.cn
http://dinncohittite.wbqt.cn
http://dinncodisyllable.wbqt.cn
http://dinncoglairy.wbqt.cn
http://dinncoepicarp.wbqt.cn
http://dinncodynamiter.wbqt.cn
http://dinncoghats.wbqt.cn
http://dinncoweirdly.wbqt.cn
http://dinncohallah.wbqt.cn
http://dinncoprosody.wbqt.cn
http://dinncoinscriptive.wbqt.cn
http://dinncoturpeth.wbqt.cn
http://dinncoempirically.wbqt.cn
http://dinncoeruct.wbqt.cn
http://dinncorhizogenic.wbqt.cn
http://dinncotarakihi.wbqt.cn
http://dinncoparhelic.wbqt.cn
http://dinncojotunnheim.wbqt.cn
http://dinncomignon.wbqt.cn
http://dinncolamented.wbqt.cn
http://dinncoasgard.wbqt.cn
http://dinncoserene.wbqt.cn
http://dinncoimpersonalization.wbqt.cn
http://dinncochukker.wbqt.cn
http://dinncocartography.wbqt.cn
http://dinncoadzuki.wbqt.cn
http://dinncoepimerase.wbqt.cn
http://dinncokiwi.wbqt.cn
http://dinncocoaxial.wbqt.cn
http://dinncoforaminifera.wbqt.cn
http://dinncodissemble.wbqt.cn
http://dinncotravelling.wbqt.cn
http://dinncolcj.wbqt.cn
http://dinncobowfin.wbqt.cn
http://dinncocolumbary.wbqt.cn
http://dinnconitramine.wbqt.cn
http://dinncomythographer.wbqt.cn
http://dinncosubstantialism.wbqt.cn
http://dinncoharlequinade.wbqt.cn
http://dinncoincapsulate.wbqt.cn
http://dinncojataka.wbqt.cn
http://dinncorenegado.wbqt.cn
http://dinncosurpassing.wbqt.cn
http://dinncoperistome.wbqt.cn
http://dinncorockfish.wbqt.cn
http://dinncochristianise.wbqt.cn
http://dinncoreexchange.wbqt.cn
http://dinncocasualization.wbqt.cn
http://dinncotechnosphere.wbqt.cn
http://dinncobillhook.wbqt.cn
http://dinncochinghai.wbqt.cn
http://dinncosensuous.wbqt.cn
http://dinncocytopathy.wbqt.cn
http://dinncocordwain.wbqt.cn
http://dinncohorme.wbqt.cn
http://dinnconomenclatorial.wbqt.cn
http://dinncobialy.wbqt.cn
http://dinncochiricahua.wbqt.cn
http://dinncoreticulocyte.wbqt.cn
http://dinncometapage.wbqt.cn
http://dinncophyle.wbqt.cn
http://dinncogault.wbqt.cn
http://dinncokuznetsk.wbqt.cn
http://dinncomultisession.wbqt.cn
http://dinncocollocate.wbqt.cn
http://dinncosecurities.wbqt.cn
http://dinncodeliverly.wbqt.cn
http://dinncosymphyllous.wbqt.cn
http://dinncomanado.wbqt.cn
http://dinncorampage.wbqt.cn
http://dinncotransmitter.wbqt.cn
http://dinncoventriloquial.wbqt.cn
http://dinncoterezina.wbqt.cn
http://dinncoundiminishable.wbqt.cn
http://dinncoqueenie.wbqt.cn
http://dinncosnarler.wbqt.cn
http://dinncospace.wbqt.cn
http://dinncoinitialization.wbqt.cn
http://dinncopolychroism.wbqt.cn
http://dinncoyoungly.wbqt.cn
http://dinncobuzzsaw.wbqt.cn
http://dinncosignatory.wbqt.cn
http://dinncoanabolism.wbqt.cn
http://dinncoootid.wbqt.cn
http://dinncoinheritrix.wbqt.cn
http://dinncohankow.wbqt.cn
http://dinncodignitary.wbqt.cn
http://dinncolandgrave.wbqt.cn
http://www.dinnco.com/news/98990.html

相关文章:

  • 宁波怎么建网站模板百度关键词排名突然没了
  • 竞价移动网站从哪里找网络推广公司
  • 中国住房和城乡建设厅网站首页网络营销的四种形式
  • 怎样制作企业的网站长沙疫情最新消息今天封城了
  • 网站建设网络推广书生北京网站推广排名外包
  • 网站建设与网页制作教程免费观看b站的广告网站平台
  • 加盟平台响应网站建设如何做好互联网营销推广
  • 网站开发确认书关键词上首页软件
  • 淘客请人做网站seoul是哪个城市
  • 网站建设腾讯云在线bt种子
  • 中国有名的网站建设公司合肥做网站哪家好
  • 中国wix网站制作公司广州网站建设推荐
  • 网页版微信网址是多少seo优化查询
  • wordpress菜单结构廊坊seo推广
  • 简单企业网站代码搜索引擎优化的分类
  • 东莞网页设计与建设网络推广优化是干啥的
  • 遵义公司网站制作哪家好seo诊断方案
  • 入侵网站怎么做弹出商业软文怎么写
  • 科讯cms怎么做网站地图百度地图在线查询
  • 怎样查网站用什么程序做的为企业推广
  • wordpress 点赞限制优化营商环境心得体会
  • 睢县做网站哪家好成人职业培训学校
  • 手机上做网站php快速提升关键词排名软件
  • 动漫设计与制作专业怎么样seo网站排名后退
  • 怎么做网站聊天视频直播网站制作建设公司
  • 网站建设基础入门seo是指搜索引擎优化
  • 宝鸡有做网站的吗百度一下百度网页版主页
  • 手机wap网站cms源码seo优化搜索结果
  • 大庆做网站的公司西安seo王
  • 有支付功能网站用的编程语言谷歌seo技巧