缓存
文章平均质量分 74
豆腐花发
哦呜
展开
-
Redis为什么是单线程的
因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。二、详细原因:1、不需要各种锁的性能消耗Redis的数据结构并不全是简单的Key-Value,还有list,hash等复杂的结构,这些结构有可能会进行很细粒度的操作,比如在很长的列表后面添加一个元素,在hash当中添加或者删除一个对象。这些操作可能就需要加非常多的锁,导致的结果是同步开销大大增加。总之,在单线原创 2020-06-23 21:33:27 · 168 阅读 · 0 评论 -
Redis事务与MySQL事务的区别
事务命令mysql:Begin:显式的开启一个事务Commit:提交事务,将对数据库进行的所有的修改变成永久性的Rollback:结束用户的事务,并撤销现在正在进行的未提交的修改redis:Multi:标记事务的开始Exec:执行事务的commands队列Discard:结束事务,并清除commands队列默认状态mysql:mysql会默认开启一个事务,且缺省设置是自动提交,即每成功执行一次sql,一个事务就会马上commit,所以不能rollbackredis:redis默认不原创 2020-06-22 22:46:55 · 674 阅读 · 0 评论 -
spring缓存
@Cache原创 2020-01-17 11:59:20 · 105 阅读 · 0 评论 -
jetCache使用
配置boot依赖 <dependency> <groupId>com.alicp.jetcache</groupId> <artifactId>jetcache-starter-redis</artifactId> <version>2....原创 2020-01-16 16:25:26 · 1118 阅读 · 0 评论 -
redis限流
计数器限流,时间段一个计数器,超过指定值,就返回错误。lua保证操作原子性。zuul网关中,使用过滤器限流。/** * 限流 * @author lipo * @version v1.0 * @date 2019-10-25 10:34 */@Slf4j@Componentpublic class LimitFilter extends OncePerRequestFilt...原创 2019-12-02 10:22:17 · 143 阅读 · 0 评论 -
redis用HyperLogLog计算UV
UV:unique visitor,独立访客,数据去重DV:distinct value,去重统计,如上面的UV。用redis的set去重,用户多时,比如微信月活10亿,就会占用很多内存。用HyperLogLog,最多12k内存,可以统计2^64=100亿亿个值,当然是模糊统计,误差0.81%。对于UV,可以有误差,比如10亿和10亿一千万,差别不大。使用 public Obj...原创 2019-11-22 17:45:32 · 342 阅读 · 0 评论 -
redis用zset做延时消息
把执行时间作为分数,存到zset中。定时任务,分数倒序取出第一个,小于当前时间,说明消息可以执行了发送延时消息服务 public Object publishDelayedMsg() { OrderDTO dto = new OrderDTO(); dto.setId(1); dto.setCreateTime(new Date());...原创 2019-11-22 14:43:21 · 1044 阅读 · 0 评论 -
redis用list做消息队列
leftPush消息入队,rightPop对应,消息出队。rightPop(RedisConstant.MQ_LIST, 0L, TimeUnit.SECONDS)阻塞出队,0表示永久阻塞生产消息服务@Servicepublic class RedisService { @Autowired private RedisTemplate<String, String&g...原创 2019-11-22 11:53:45 · 4429 阅读 · 0 评论 -
redis发布订阅
生产者@Component@Slf4jpublic class MqProducer { @Autowired private RedisTemplate redisTemplate; public void send(String topic, String msg) { log.info("topic ={}, msg = {}", topic...原创 2019-11-13 14:20:09 · 64 阅读 · 0 评论 -
redis用lua实现初始值id自增
实现@Componentpublic class RedisInitId { private String DISTRIBUTE_INIT_ID = "DISTRIBUTE_INIT_ID"; @Autowired private StringRedisTemplate redisTemplate; private static final String ...原创 2019-09-17 13:46:43 · 1228 阅读 · 0 评论 -
redis做分布式id
速度很快,一万个才半秒最安全,比随机数安全多了长度合适,不想随机数很长16位id,比如2019073000000041,前八位日期,后八位redis计数器,格式化成八位长数字字符串@Componentpublic class RedisId { private String DISTRIBUTE_ID = "DISTRIBUTE_ID:"; private String ...原创 2019-07-30 10:32:49 · 1390 阅读 · 1 评论 -
RedisLockRegistry源码-redis分布式锁
redis实现分布式锁,实现了Lock接口,和ReentrantLock意向,有可重入,阻塞等功能使用依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifac...原创 2019-07-19 18:00:41 · 8031 阅读 · 4 评论 -
redis使用lua脚本
用RedisTemplate调用RedisScriptmaven依赖spring-boot-starter-data-redis和jedis <dependencies> <dependency> <groupId>org.springframework.boot</groupId> ...原创 2019-07-19 15:46:01 · 308 阅读 · 0 评论 -
redis原理
道森股份原创 2019-02-20 21:31:39 · 224 阅读 · 0 评论 -
redis集群
架构细节(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.127.0.0.1:6380> pingPONG(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.集群都是奇数个(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可(4)redis-cluste...原创 2019-02-24 20:16:20 · 230 阅读 · 0 评论 -
redis主从复制
分类全量同步Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:从服务器连接主服务器,发送SYNC命令;主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;从服务器收到快...原创 2019-02-24 20:29:41 · 81 阅读 · 0 评论 -
LRU最少最近使用缓存策略
LRU(Least Recently Used)直译为“最近最少使用”缓存的容量是有限的当缓存容量不足以存放需要缓存的新数据时,必须丢掉最不常用的缓存数据使用hashmap存储数据,双向链表对数据排序,和LinkedHashMap相似写入缓存,或查询缓存时,把数据移到头结点package com.study.demo;import java.util.HashMap;/** *...原创 2019-05-04 14:23:04 · 560 阅读 · 0 评论