10-redis

Redis:

1、数据结构:string, hash, list, set, sorted set

2、memcache对比:

1)数据类型更丰富

2)可以持久化

问题:单线程性能优势(IO多路复用)

1)直接操作内存

2)单线程,无需上下文切换及锁开销

3)基于IO多路复用

3、持久化与性能

1)Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件

2)如果数据比较重要,某个Slave开启AOF备份数据,策略设置为Always

3)为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内

4)尽量避免在压力很大的主库上增加从库

5)主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...

  这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。

4、集群方案

Redis 集群的键空间被分割为 16384 个槽(slot), 集群的最大节点数量也是 16384 个

主从方案

哨兵方案

集群方案

5、场景问题

5.1 缓存与数据库一致性

https://tech.imdada.cn/2017/06/30/daojia-redis/

http://ifeve.com/concurrency-cache-cross/

更新顺序:失效:从缓存中读取,没得到则从数据库取数据,成功后放到缓存;

命中:从缓存中读取,取到直接返回;

更新:先将数据保存至数据库,再让缓存失效

同步:单独同步服务,分析读取mysql binLog + 消息队列 + 处理后更新到缓存

强一致性:缓存一般不应用于强一致性场景,如金融业务

5.2 缓存穿透

1、若缓存不存在,查询数据库使用分布式锁,获取锁时再次判断缓存中是否存在

2、查询数据库,数据库中若不存在该数据,则将NULL放入缓存中(失效时间短)

3、将缓存失效时间分散开,可以在原有的失效时间基础上增加一个随机值

5.3 如果有大量的key需要设置同一时间过期,一般需要注意什么

    将缓存失效时间分散开,比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,

    这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件

5.4 如何保证redis都是热点数据(考察缓存失效策略)

    LRU:从已设置过期时间和从所有数据中,选择最近最少使用淘汰

    Random:从已设置过期时间和从所有数据中,随机选择淘汰

    即将过期:从已设置过期时间的数据中,选择将要过期的淘汰

6、应用场景

分布式session,分布式锁,队列、排行榜、计数器

7、分布式锁:

使用jedis.setnx()命令实现加锁,其中key是锁,value是锁的过期时间。

执行过程:

1. 通过setnx()方法尝试加锁,如果当前锁不存在,返回加锁成功。

2. 如果锁已经存在则获取锁的过期时间,和当前时间比较,如果锁已经过期,则设置新的过期时间,返回加锁成功。代码如下:


publicstaticbooleanwrongGetLock2(Jedis jedis, String lockKey, intexpireTime) {


    longexpires = System.currentTimeMillis() + expireTime;

    String expiresStr = String.valueOf(expires);


    // 如果当前锁不存在,返回加锁成功

    if(jedis.setnx(lockKey, expiresStr) == 1) {

        returntrue;

    }


    // 如果锁存在,获取锁的过期时间

    String currentValueStr = jedis.get(lockKey);

    if(currentValueStr != null&& Long.parseLong(currentValueStr) < System.currentTimeMillis()) {

        // 锁已过期,获取上一个锁的过期时间,并设置现在锁的过期时间

        String oldValueStr = jedis.getSet(lockKey, expiresStr);

        if(oldValueStr != null&& oldValueStr.equals(currentValueStr)) {

            // 考虑多线程并发的情况,只有一个线程的设置值和当前值相同,它才有权利加锁

            return true;

        }

    }


    // 其他情况,一律返回加锁失败

    return false;

}

那么这段代码问题在哪里?

1. 由于是客户端自己生成过期时间,所以需要强制要求分布式下每个客户端的时间必须同步。 2. 当锁过期的时候,如果多个客户端同时执行jedis.getSet()方法,那么虽然最终只有一个客户端可以加锁,但是这个客户端的锁的过期时间可能被其他客户端覆盖。3. 锁不具备拥有者标识,即任何客户端都可以解锁。

http://www.importnew.com/27477.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容