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

网站做多个产品织梦做社交网站合适吗

网站做多个产品,织梦做社交网站合适吗,公司网站维护费大概需要多少,wordpress数据可视化插件一、Jedis、Lettuce、Redisson的简介 优先使用Lettuce#xff0c; 需要分布式锁#xff0c;分布式集合等分布式的高级特性#xff0c;添加Redisson结合使用。 对于高并发#xff0c;1000/s的并发#xff0c;数据库可能由行锁变成表锁#xff0c;性能下降会厉害。 1.1、…一、Jedis、Lettuce、Redisson的简介 优先使用Lettuce 需要分布式锁分布式集合等分布式的高级特性添加Redisson结合使用。 对于高并发1000/s的并发数据库可能由行锁变成表锁性能下降会厉害。 1.1、Jedis 老牌Redis的Java客户端提供比较全面的Redis命令的支持 使用阻塞的I/O方法调用都是同步的程序流需要等到sockets处理完I/O才能执行不支持异步。 Jedis客户端实例不是线程安全的使直接连接redis server需要通过连接池来使用Jedis为每个jedis实例增加物理连接。 1.2、Lettuce SpringBoot2之后默认就采用了lettuce。  高级Redis客户端基于Netty框架的事件驱动的通信层用于线程安全同步异步和响应使用支持集群Sentinel管道和编码器。 Lettuce的API是线程安全的可以操作单个Lettuce连接来完成各种操作连接实例StatefulRedisConnection可在多个线程间并发访问。 1.3、Redisson 基于Netty框架的事件驱动的通信层方法是异步的API线程安全可操作单个Redisson连接来完成各种操作。 实现了分布式和可扩展的Java数据结构不支持字符串操作不支持排序、事务、管道、分区等Redis特性。 提供很多分布式相关操作服务如分布式锁分布式集合可通过 Redis支持延迟队列。 二、SpringBoot 的 RedisTemplate 2.1、配置 !--redisspring-boot-starter-data-redis中包含的Lettuce-- dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId /dependency !--Lettuce使用线程池必要包-- dependencygroupIdorg.apache.commons/groupIdartifactIdcommons-pool2/artifactId /dependency !-- Redisson依赖 -- dependencygroupIdorg.redisson/groupIdartifactIdredisson/artifactIdversion3.23.2/version /dependency ####################redis连接配置############ redis: # cluster: # nodes: # - 127.0.0.1:7001 # - 127.0.0.1:7002 # - 127.0.0.1:7003 # host: 127.0.0.1port: 6379password: 123456database: 0timeout: 2000mslettuce:pool:# 连接池最大连接数max-active: 20# 连接池中的最小空闲连接max-idle: 10# 连接池最大阻塞等待时间(使用负数表示没有限制,单位ms)max-wait: 3000 2.2、代码使用 2..2.1.配置 RedisTemplate Configuration public class RedisConfig {/*** 创建 RedisTemplate注入IOC容器*/Beanpublic RedisTemplateString, Object redisTemplate(RedisConnectionFactory factory) {RedisTemplateString, Object template new RedisTemplate();// 设置数据源的连接工厂默认会传入框架中自带的也就是读取完配置文件装配的LettuceConnectionFactory// 也可以自己定义注入容器再通过Qualifier()传进来 template.setConnectionFactory(factory);//设置key的序列化器template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new Jackson2JsonRedisSerializer(Object.class));// hash的key也采用String的序列化方式template.setHashKeySerializer(new StringRedisSerializer());template.setHashValueSerializer(new Jackson2JsonRedisSerializer(Object.class));return template;} } 2..2.3.RedisTemplate 封装 Component public class RedisClient {Autowiredprivate RedisTemplateString, Object redisTemplate;/*** 指定缓存失效时间* param key 键* param time 时间(秒)*/public boolean expire(String key,long time){try {if(time0){redisTemplate.expire(key, time, TimeUnit.SECONDS);}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 根据key 获取过期时间* param key 键 不能为null* return 时间(秒) 返回0代表为永久有效*/public long ttl(String key){return redisTemplate.getExpire(key,TimeUnit.SECONDS);}//String/*** 普通缓存获取* param key 键* return 值*/public Object get(String key){return keynull?null:redisTemplate.opsForValue().get(key);}/*** 普通缓存放入* param key 键* param value 值* return true成功 false失败*/public boolean set(String key,Object value) {try {redisTemplate.opsForValue().set(key, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 删除缓存* param key 可以传一个值 或多个*/public Boolean del(String key){return redisTemplate.delete(key);}//hash/*** HashGet* param key 键 不能为null* param item 项 不能为null*/public Object hget(String key,String item){return redisTemplate.opsForHash().get(key, item);}/*** 向 hash 表中放入数据,如果不存在将创建* param key 键* param item 项* param value 值* return true 成功 false失败*/public boolean hset(String key,String item,Object value) {try {redisTemplate.opsForHash().put(key, item, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 删除hash表中的值* param key 键 不能为null* param item 项 可以使多个 不能为null*/public void hdel(String key, Object... item){redisTemplate.opsForHash().delete(key,item);}//set/*** 根据key获取Set中的所有值* param key 键*/public SetObject smembers(String key){try {return redisTemplate.opsForSet().members(key);} catch (Exception e) {e.printStackTrace();return null;}}/*** 将数据放入set缓存* param key 键* param values 值 可以是多个* return 成功个数*/public long sadd(String key, Object...values) {try {return redisTemplate.opsForSet().add(key, values);} catch (Exception e) {e.printStackTrace();return 0;}}/*** 移除值为value的* param key 键* param values 值 可以是多个* return 移除的个数*/public long srem(String key, Object ...values) {try {Long count redisTemplate.opsForSet().remove(key, values);return count;} catch (Exception e) {e.printStackTrace();return 0;}}//list/*** 获取list缓存的内容* param key 键* param start 开始* param end 结束 0 到 -1代表所有值*/public ListObject lrange(String key, long start, long end){try {return redisTemplate.opsForList().range(key, start, end);} catch (Exception e) {e.printStackTrace();return null;}}/*** 将list放入缓存* param key 键* param value 值*/public boolean rpush(String key, Object value) {try {redisTemplate.opsForList().rightPush(key, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 将list放入缓存* param key 键* param value 值*/public boolean lpush(String key, ListObject value) {try {redisTemplate.opsForList().rightPushAll(key, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 移除N个值为value* param key 键* param count 移除多少个* param value 值* return 移除的个数*/public long lrem(String key,long count,Object value) {try {Long remove redisTemplate.opsForList().remove(key, count, value);return remove;} catch (Exception e) {e.printStackTrace();return 0;}} } 三、SpringBoot 的 Redisson  Redisson官方文档: https://github.com/redisson/redisson/wiki 3.1、在之前的 Configuration 里添加 Bean Configuration public class RedisConfig {// 锁前缀 private static final String SCHEMA_PREFIX redis://;// 超时时间private final long lockWatchTimeOut 3000; /*** 创建 RedisTemplate注入IOC容器*/Beanpublic RedisTemplateString, Object redisTemplate(RedisConnectionFactory factory) {RedisTemplateString, Object template new RedisTemplate();// 设置数据源的连接工厂默认会传入框架中自带的也就是读取完配置文件装配的LettuceConnectionFactory// 也可以自己定义注入容器再通过Qualifier()传进来 template.setConnectionFactory(factory);//设置key的序列化器template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new Jackson2JsonRedisSerializer(Object.class));// hash的key也采用String的序列化方式template.setHashKeySerializer(new StringRedisSerializer());template.setHashValueSerializer(new Jackson2JsonRedisSerializer(Object.class));return template;}/*** 创建 RedissonClient注入IOC容器*/Beanpublic RedissonClient redissonClient(RedisProperties redisProperties) {Config config new Config();RedisProperties.Sentinel sentinel redisProperties.getSentinel();RedisProperties.Cluster redisPropertiesCluster redisProperties.getCluster();if (redisPropertiesCluster ! null) {//集群redisClusterServersConfig clusterServersConfig config.useClusterServers();for (String cluster : redisPropertiesCluster.getNodes()) {clusterServersConfig.addNodeAddress(SCHEMA_PREFIX cluster);}if (StringUtils.hasText(redisProperties.getPassword())) {clusterServersConfig.setPassword(redisProperties.getPassword());}clusterServersConfig.setTimeout((int) redisProperties.getTimeout().toMillis());clusterServersConfig.setPingConnectionInterval(30000);} else if (StringUtils.hasText(redisProperties.getHost())) {//单点redisSingleServerConfig singleServerConfig config.useSingleServer().setAddress(SCHEMA_PREFIX redisProperties.getHost() : redisProperties.getPort());if (StringUtils.hasText(redisProperties.getPassword())) {singleServerConfig.setPassword(redisProperties.getPassword());}singleServerConfig.setTimeout((int) redisProperties.getTimeout().toMillis());singleServerConfig.setPingConnectionInterval(30000);singleServerConfig.setDatabase(redisProperties.getDatabase());} else if (sentinel ! null) {//哨兵模式SentinelServersConfig sentinelServersConfig config.useSentinelServers();sentinelServersConfig.setMasterName(sentinel.getMaster());for (String node : sentinel.getNodes()) {sentinelServersConfig.addSentinelAddress(SCHEMA_PREFIX node);}if (StringUtils.hasText(redisProperties.getPassword())) {sentinelServersConfig.setPassword(redisProperties.getPassword());}sentinelServersConfig.setTimeout((int) redisProperties.getTimeout().toMillis());sentinelServersConfig.setPingConnectionInterval(30000);sentinelServersConfig.setDatabase(redisProperties.getDatabase());}config.setLockWatchdogTimeout(lockWatchTimeOut);return Redisson.create(config);}} 3.2、分布式锁 Redisson续期机制—看门狗机制 1.启动定时任务重新给锁设置过期时间默认过期时间是 30 秒每 10 秒默认事件的1/3续期一次补到 30 秒 2.如果线程挂掉服务器宕机则不会续期。 3.只有lock.lock(); 会有看门狗机制 4.lock.lock(10,,TimeUnit.SECONDS)手动设置过期时间的话则不会有看门狗机制。 /*** 分布式Redis锁*/ Slf4j public class DistributedRedisLock {Autowiredprivate RedissonClient redissonClient;// 加锁public Boolean lock(String lockName) {if (redissonClient null) {log.info(DistributedRedisLock redissonClient is null);return false;}try {RLock lock redissonClient.getLock(lockName);// 锁15秒后自动释放防止死锁lock.lock(15, TimeUnit.SECONDS);// 加锁成功return true;} catch (Exception e) {e.printStackTrace();return false;}}// 释放锁public Boolean unlock(String lockName) {if (redissonClient null) {log.info(DistributedRedisLock redissonClient is null);return false;}try {RLock lock redissonClient.getLock(lockName);lock.unlock();// 释放锁成功return true;} catch (Exception e) {e.printStackTrace();return false;}} } 3.3、读写锁  Autowired RedissonClient redisson;Autowired RedisTemplate redisTemplate;ResponseBody GetMapping(/write) public String writeValue(){RReadWriteLock lock redisson.getReadWriteLock(rw-lock);RLock rLock lock.writeLock();String s ;try {s UUID.randomUUID().toString();// 模拟业务时间 Thread.sleep(30000);} catch (Exception e){e.printStackTrace();}finally {rLock.unlock();}redisTemplate.opsForValue().set(writeValue,s);return s; }GetMapping(value /read) ResponseBody public String readValue() {String s ;RReadWriteLock readWriteLock redisson.getReadWriteLock(rw-lock);//加读锁RLock rLock readWriteLock.readLock();try {rLock.lock();s (String) redisTemplate.opsForValue().get(writeValue);TimeUnit.SECONDS.sleep(10);} catch (Exception e) {e.printStackTrace();} finally {rLock.unlock();}return s; } 3.4、闭锁  GetMapping(value /lockDoor) ResponseBody public String lockDoor() throws InterruptedException {RCountDownLatch lockDoor redisson.getCountDownLatch(lockDoor);lockDoor.trySetCount(5); // 设置计数为5lockDoor.await(); //等待闭锁完成return 放假啦...; }GetMapping(value /go/{id}) public String go(PathVariable(id) Integer id) {RCountDownLatch lockDoor redisson.getCountDownLatch(lockDoor);lockDoor.countDown(); // 计数减1return id班都走光了; } 3.5、信号量  GetMapping(value /park) ResponseBody public String park() {RSemaphore park redisson.getSemaphore(park);try {park.acquire();// 获取一个信号量redis中信号量值-1,如果redis中信号量为0了则在这里阻塞住直到信号量大于0可以拿到信号量才会继续执行。} catch (InterruptedException e) {e.printStackTrace();}return ok; }GetMapping(value /go) ResponseBody public String go() {RSemaphore park redisson.getSemaphore(park);park.release(); //释放一个信号量redis中信号量值1return ok; }
http://www.yutouwan.com/news/196595/

相关文章:

  • 福州网站制作公司名字高校信息化建设网站系统微信
  • 网站建设流程表网站开发 软文
  • 苏州国内网站建设公司连运港网络公司做网站
  • 欧泰国际物流网站wordpress+下载受限
  • 一般做外贸上什么网站好有没有专门做团购的网站
  • 域名后缀html是怎样的网站株洲市
  • 成品网站w灬源码火龙果公司网站设计注意事项
  • 长沙seo网站管理网页设计可以进怎样的公司
  • vs2017 如何做网站农业展示网站模板下载
  • wordpress网站非常慢品牌广告语经典100条
  • 杭州品牌网站建设招标文件范本
  • 北京 外贸网站网站改版汇报
  • 徐州企业自助建站企业如何全面开展品牌工程建设
  • 京美建站官网网站宝 西部数码网站管理助手
  • 重庆医院网站建设thinkphp做的网站怎么预览
  • 网站历史快照网站建设和网络营销区别
  • 重庆网站设计公司网站制作中山品牌网站设计
  • 临沂营销型网站建设公司常见八大职能部门
  • 做网站的开发软件是什么郑州网站高端网站设计
  • 海派虫网站推广软件wordpress模板使用
  • 量子秘密网站怎么做成都最新新闻事件今天
  • 北京专业的做网站适合个人做的网站有哪些东西吗
  • 网站建设需要代码网站建设方案对比分析
  • 提供网站建设备案报价做网站什么时候注册商标
  • 建设网站群的好处wordpress标签墙
  • wordpress如何做站群章丘网站定制
  • 怎么做类似淘宝一样的网站毕业设计网站建设选题依据
  • 陕西网站建设品牌公司推荐重庆大渡口营销型网站建设价格
  • 临沂网站建设排名重庆建设岗位培训系统
  • 聊城门户网站建设wordpress本地头像