
缓存
文章平均质量分 84
redis、memcache等缓存
东境物语
欢迎访问!!!
展开
-
memcached底层工作原理
1、memcached是怎么工作的?Memcached的神奇来自两阶段哈希(two-stage hash)。Memcached就像一个巨大的、存储了很多对的哈希表。通过key,可以存储或查询任意的数据。客户端可以把数据存储在多台memcached上。当查询数据时,客户端首先参考节点列表计算出key的哈希值(阶段一哈 希),进而选中一个节点;客户端将请求发送给选中的节点,然后memcac原创 2015-07-12 16:26:13 · 2799 阅读 · 0 评论 -
一文搞懂Redis架构演化之路
总结一下,我们是如何从 0 到 1,再从 1 到 N 构建一个稳定、高性能的 Redis 集群的,从这之中你可以清晰地看到 Redis 架构演进的整个过程。数据怕丢失:持久化(RDB/AOF)主从副本(副本随时可切)故障手动切换慢:哨兵集群(自动切换)读存在压力:扩容副本(读写分离)写存在压力/容量瓶颈:分片集群分片集群社区方案:Twemproxy、Codis(Redis 节点之间无通信,需要部署哨兵,可横向扩容)分片集群官方方案。转载 2023-07-25 22:01:11 · 156 阅读 · 0 评论 -
如何处理redis集群中的hot Key
一般对于单实例的redis或者一主一备的redis来说(热点key参考https://mp.youkuaiyun.com/postedit/87862837),不需要考虑hot key的问题。但是随着业务量的上升,redis集群也自然而然的会成为一个选择。hot key的概念当使用redis集群来作为缓存的时候,如果在业务上碰到大促,或者正好有一个非常热的帖子的时候,对应的缓存会被频繁访问。而这个缓存...原创 2019-06-17 18:42:10 · 1301 阅读 · 1 评论 -
如何保证缓存(redis)与数据库(MySQL)的一致性
【简介】 对于热点数据(经常被查询,但不经常被修改的数据),我们可以将其放入redis缓存中,以增加查询效率,但需要保证从redis中读取的数据与数据库中存储的数据最终是一致的。本文基于“孤独烟”与“58沈剑”两位的文章,针对一致性的问题进行了汇总总结,两位的原文链接见文末。【前言】 客户端对数据库中的数据主要有两类操作,读(select)与写(DML)。针对放入redis中缓存的热点数据,当客户端想读取的数据在缓存中就直接返回数据,即命中缓存(cache hit),当读取的数据不在缓存内,就转载 2020-06-22 15:32:46 · 12479 阅读 · 1 评论 -
Redis并发竞争key的解决方案详解
1.Redis高并发的问题Redis缓存的高性能有目共睹,应用的场景也是非常广泛,但是在高并发的场景下,也会出现问题:缓存击穿、缓存雪崩、缓存和数据一致性,以及今天要谈到的缓存并发竞争。这里的并发指的是多个redis的client同时set key引起的并发问题。2.出现并发设置Key的原因Redis是一种单线程机制的nosql数据库,基于key-value,数据可持久化落盘。由于单线程所以Redis本身并没有锁的概念,多个客户端连接并不存在竞争关系,但是利用jedis等客户端对Redis进原创 2020-06-01 16:18:59 · 2510 阅读 · 0 评论 -
JedisCluster 批量操作
Redis集群是没法执行批量操作命令的,如mget,pipeline等。这是因为redis将集群划分为16383个哈希槽,不同的key会划分到不同的槽中。原生JedisCluster对批量操作的限制是mget mset 必须在一个槽;四种批量优化的方法1、串行 mget在 for 循环中执行一条条的 get; 需要 n 次网络时间;2、串行 IO在客户端对所有 key 做 CR...原创 2019-12-24 11:32:27 · 2621 阅读 · 0 评论 -
redis缓存与数据库一致性问题解决
一、需求起因假设先写数据库,再淘汰缓存:第一步写数据库操作成功,第二步淘汰缓存失败,则会出现DB中是新数据,Cache中是旧数据,数据不一致【如下图:db中是新数据,cache中是旧数据】。假设先淘汰缓存,再写数据库:第一步淘汰缓存成功,第二步写数据库失败【如下图:cache中无数据,db中是旧数据】。结论:先淘汰缓存,再写数据库。二、数据不一致原因先操作缓存,在写数据库成...原创 2019-09-19 16:55:05 · 788 阅读 · 1 评论 -
redis的三种集群方式
redis有三种集群方式:主从复制,哨兵模式和集群。1.主从复制主从复制原理:从服务器连接主服务器,发送SYNC命令; 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令; 主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令; 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照...原创 2019-07-08 17:41:02 · 844 阅读 · 0 评论 -
Redis中存储亿级键值对
迁移系统时,有时你必须建立一个小脚手架。我们最近不得不这样做:在Instagram上,于遗留原因,我们需要将大约3亿张照片映射到创建它们的用户的ID,以便了解要查询的分片(请参阅有关我们的更多信息)分片设置)。虽然所有客户端和API应用程序都已更新并向我们返回 完整信息,但仍有许多人缓存的旧数据。我们需要一个解决方案:查找键并快速返回值 将数据存在内存中,理想情况下是在EC2高内存类型(17...原创 2019-06-18 11:16:09 · 2177 阅读 · 1 评论 -
如何处理redis集群中hot key和big key
概述redis 集群部署方式大部分采用类 Twemproxy 的方式进行部署。即通过 Twemproxy 对 redis key 进行分片计算,将 redis key 进行分片计算,分配到多个 redis 实例中的其中一个。tewmproxy 架构图如下:由于 Twemproxy 背后的多个 redis 实例在内存配置和 cpu 配置上都是一致的,所以一旦出现访问量倾斜或者数据量...原创 2019-06-17 19:56:02 · 2364 阅读 · 2 评论 -
如何提取Redis中的大KEY
工作中,经常有些Redis实例使用不恰当,或者对业务预估不准确,或者key没有及时进行处理等等原因,导致某些KEY相当大。那么大Key会带来哪些问题呢?如果是集群模式下,无法做到负载均衡,导致请求倾斜到某个实例上,而这个实例的QPS会比较大,内存占用也较多;对于Redis单线程模型又容易出现CPU瓶颈,当内存出现瓶颈时,只能进行纵向库容,使用更牛逼的服务器。 涉及到大key的操作,尤其是...原创 2019-06-17 20:34:58 · 2690 阅读 · 1 评论 -
如何做到阿里云 Redis 开发规范中的拒绝 bigkey
代码中的问题,光靠 Code Review 是不够的。Code Review 主要是解决规范问题,当然也能排查出一些 bug。Code Review 适合技术驱动型团队、公共服务型团队、测试缺失型团队、新人密集型团队、任何有主观意愿的团队。Code Review 活动主要围绕下面 4 项工作开展。说到代码规范,我们就不得不提阿里云的 Redis 开发规范。这个规范写的很好,想把我说的都...原创 2019-06-17 20:31:21 · 2649 阅读 · 1 评论 -
Redis大Key分拆方案
业务场景中经常会有各种大key的情况, 比如:1. 单个简单的key存储的value很大2. hash、set、zset、list中存储过多的元素(以万为单位)(文章中所提及的hash,set等数据结构均指redis中的数据结构)由于redis是单线程运行的,如果一次操作的value很大会对整个redis的响应时间造成负面影响,所以,业务上能拆则拆,下面举几个典型的分拆方案。1...原创 2019-02-21 09:35:31 · 6849 阅读 · 0 评论 -
热点key解决方案
热点问题概述产生原因热点问题产生的原因大致有以下两种:用户消费的数据远大于生产的数据 (热卖商品、热点新闻、热点评论、明星直播)在日常工作生活中一些突发的的事件,例如:双十一期间某些热门商品的降价促销,当这其中的某一件商品被数万次点击浏览或者购买时,会形成一个较大的需求量,这种情况下就会造成热点问题。同理,被大量刊发、浏览的热点新闻、热点评论、明星直播等,这些典型的读多写少的场景也会产...原创 2019-02-21 16:03:21 · 1830 阅读 · 0 评论 -
分布式锁实现(一)
使用Redis的 SETNX 命令实现分布式锁。SETNX命令简介命令格式SETNX key value将 key 的值设为 value,当且仅当 key 不存在。 若给定的 key 已经存在,则 SETNX 不做任何动作。 SETNX 是SET if Not eXists的简写。返回值返回整数,具体为 - 1,当 key 的值被设置 - 0,当 key 的值没...原创 2018-03-07 16:06:35 · 444 阅读 · 0 评论 -
Redis-Dump安装及使用(redis数据导出)
前言在Redis的应用中有的时候我们需要将Redis中的数据导出,然后在另一台Redis上将数据导入,这个过程需要用到一个工具叫做redis-dump,今天主要向大家介绍改工具的安装及使用。安装RVMredis-dump这款工具需要用到Ruby,而centos环境中的yum工具可以安装的Ruby版本最高是2.0的版本,而当前Redis最新的4.0版本中需要用到的Ruby >= 2...原创 2018-10-31 14:31:30 · 8302 阅读 · 7 评论 -
阿里云Redis开发规范
摘要:本文介绍了在使用阿里云Redis的开发规范,从键值设计、命令使用、客户端使用、相关工具等方面进行说明,通过本文的介绍可以减少使用Redis过程带来的问题。一、键值设计1. key名设计(1)【建议】: 可读性和可管理性以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:idugc:video:1(2)【建议】:简洁性保证语义的前提下,控制key的长度,当key较多...原创 2018-03-16 18:34:23 · 273 阅读 · 0 评论 -
分布式锁实现(基于redis)
锁是很多系统的基础服务,但是实现分布式环境的锁并不是简单的事情。还好现在各类组件齐全,今天我们介绍基于Redis的锁的Java实现-redssion。(基于Redis的setnx原生实现的分布式锁:http://blog.youkuaiyun.com/wwd0501/article/details/79472511)1.安装redis安装redssion的锁服务队redis的版本有要求,要求必须高于2.8版本...原创 2016-02-22 16:16:00 · 2014 阅读 · 0 评论 -
Redis键值结构设计
和MySQL数据库关系表的设计不同 <这篇文章是网上已有的加以总结>用户登录系统记录用户登录信息表MySQL1mysql>select* from login;2+---------+----------------+-------------+---------------------+3| user_id | name | login_times |...原创 2018-03-05 10:29:18 · 2337 阅读 · 0 评论 -
redis有序集合(sorted sets)介绍(积分排行榜应用)
一、概述: Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管Sorted-Sets中的成员必须是唯一的,但是分数(score)却是可以重复的。原创 2018-01-11 17:57:33 · 1357 阅读 · 0 评论 -
redis遇到的问题
redis遇到问题:1、主从不同步(如:主库已过期,从库数据还存在,解决方式:判断ttl,若ttl>0,直接取redis;若是ttl2、当前已用内存超过maxmemory限定时,触发主动清理策略3、Redis过期键删除策略(遇到过冷数据没有删除的情况,执行get命令后删除了) (1)被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key原创 2017-03-14 10:36:40 · 925 阅读 · 0 评论 -
《Redis官方文档》Redis集群教程
这篇教程是Redis集群的简要介绍,而非讲解分布式系统的复杂概念。它主要从一个使用者的角度介绍如何搭建、测试和使用Redis集群,至于Redis集群的详细设计将在“Redis集群规范”中进行描述。本教程以redis使用者的角度,用简单易懂的方式介绍Redis集群的可用性和一致性。注意: 本教程要求redis3.0或以上的版本。如果你打算部署redis集群,你可以读一些关于集原创 2017-07-27 14:49:34 · 584 阅读 · 0 评论 -
redis批量删除key
redis批量删除keyredis本身不支持批量删除key.可以借助shell和lua脚本来实现比如删除前缀为 “phone” 的所有key1. shell脚本redis-cli KEYS "phone*" | xargs redis-cli DEL2. lua 脚本 windows客户端下可以使用redis-cli eval "原创 2015-09-23 10:53:40 · 3071 阅读 · 0 评论 -
关于Redis数据过期策略
1、Redis中key的的过期时间通过EXPIRE key seconds命令来设置数据的过期时间。返回1表明设置成功,返回0表明key不存在或者不能成功设置过期时间。在key上设置了过期时间后key将在指定的秒数后被自动删除。被指定了过期时间的key在Redis中被称为是不稳定的。当key被DEL命令删除或者被SET、GETSET命令重置后与之关联的过期时间会被清除原创 2016-07-13 17:38:35 · 9764 阅读 · 0 评论 -
Redis优化
根据业务需要选择合适的数据类型,并为不同的应用场景设置相应的紧凑存储参数。当业务场景不需要数据持久化时,关闭所有的持久化方式可以获得最佳的性能以及最大的内存使用量。如果需要使用持久化,根据是否可以容忍重启丢失部分数据在快照方式与语句追加方式之间选择其一,不要使用虚拟内存以及diskstore方式。不要让你的Redis所在机器物理内存使用超过实际内存总量的3/5。原创 2014-11-04 19:07:55 · 712 阅读 · 0 评论 -
redis主从不同步问题处理
近期遇到的问题如下:1 在主上setex的key即使过期后在从上也始终get的到。重现:主: setex abc 20 test从:get abc >> testttl abc >> 18...ttl abc >> -1get abc >> test (这里竟然还有~!)主:get abc >> nil从:g原创 2016-05-03 21:18:59 · 9027 阅读 · 0 评论 -
redis常用操作以及主从配置
启动redis # src/redis-server 启动的是默认配置(与redis.conf配置文件无关)# src/redis-server path/redis.conf 启动redis.conf中的配置(修改后的配置文件)关闭redis # src/redis-cli -h 127.0.0.1 -p 6379 shutdown 关闭redis服务器,关原创 2015-07-22 17:19:33 · 787 阅读 · 0 评论 -
Redis的客户端实现-Jedis
#redis服务器IPredis.ip=192.168.1.74#redis服务Portredis.port=6379#最大分配的对象数redis.pool.maxActive=1024#最大能够保持idel状态的对象数redis.pool.maxIdle=200#当池内没有返回对象时,最大等待时间redis.pool.maxWait=1000#当调用borrow Object原创 2014-11-04 17:36:58 · 896 阅读 · 0 评论 -
Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式等)介绍
Redis是一个著名的key-value存储系统,而作为其官方推荐的java版客户端jedis也非常强大和稳定,支持事务、管道及有jedis自身实现的分布式。最简单和基础的调用方式很简单吧,每次set之后都可以返回结果,标记是否成功。redis的事务很简单,他主要目的是保障,一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。我们调用jedis.watch(…)方法来监控key,如果调用后key值发生变化,则整个事务会执行失败。原创 2014-11-03 10:32:50 · 768 阅读 · 0 评论