精华内容
下载资源
问答
  • .Net Redis 基本用法 http://www.zhifeiya.cn/post/net-redis http://www.cnblogs.com/tdws/p/5712835.html 转载于:https://www.cnblogs.com/mschen/p/8334410.html

     

    .Net Redis 基本用法

    http://www.zhifeiya.cn/post/net-redis

    http://www.cnblogs.com/tdws/p/5712835.html

    转载于:https://www.cnblogs.com/mschen/p/8334410.html

    展开全文
  • redis并发

    千次阅读 2016-12-20 15:48:16
    Redis并发问题 Redis为单进程单线程模式,采用队列模式将并发访问变为串行访问。Redis本身没有锁的概念,Redis对于个客户端连接并不存在竞争,但是在Jedis客户端对Redis进行并发访问时会发生连接超时、数据转换...

    Redis并发问题

    Redis为单进程单线程模式,采用队列模式将并发访问变为串行访问。Redis本身没有锁的概念,Redis对于多个客户端连接并不存在竞争,但是在Jedis客户端对Redis进行并发访问时会发生连接超时、数据转换错误、阻塞、客户端关闭连接等问题,这些问题均是由于客户端连接混乱造成。对此有2种解决方法:

    1.客户端角度,为保证每个客户端间正常有序与Redis进行通信,对连接进行池化,同时对客户端读写Redis操作采用内部锁synchronized。

    2.服务器角度,利用setnx实现锁。

    对于第一种,需要应用程序自己处理资源的同步,可以使用的方法比较通俗,可以使用synchronized也可以使用lock;第二种需要用到Redis的setnx命令,但是需要注意一些问题。

    SETNX命令(SET if Not eXists)

    语法:
    SETNX key value

    功能:
    将 key 的值设为 value ,当且仅当 key 不存在;若给定的 key 已经存在,则 SETNX 不做任何动作。

    时间复杂度:
    O(1)
    返回值:
    设置成功,返回 1 。
    设置失败,返回 0 。

    模式:将 SETNX 用于加锁(locking)

    SETNX 可以用作加锁原语(locking primitive)。比如说,要对关键字(key) foo 加锁,客户端可以尝试以下方式:

    SETNX lock.foo <current Unix time + lock timeout + 1>

    如果 SETNX 返回 1 ,说明客户端已经获得了锁, key 设置的unix时间则指定了锁失效的时间。之后客户端可以通过 DEL lock.foo 来释放锁。

    如果 SETNX 返回 0 ,说明 key 已经被其他客户端上锁了。如果锁是非阻塞(non blocking lock)的,我们可以选择返回调用,或者进入一个重试循环,直到成功获得锁或重试超时(timeout)。

    但是已经证实仅仅使用SETNX加锁带有竞争条件,在特定的情况下会造成错误。

    处理死锁(deadlock)

    上面的锁算法有一个问题:如果因为客户端失败、崩溃或其他原因导致没有办法释放锁的话,怎么办?

    这种状况可以通过检测发现——因为上锁的 key 保存的是 unix 时间戳,假如 key 值的时间戳小于当前的时间戳,表示锁已经不再有效。

    但是,当有多个客户端同时检测一个锁是否过期并尝试释放它的时候,我们不能简单粗暴地删除死锁的 key ,再用 SETNX 上锁,因为这时竞争条件(race condition)已经形成了:

    C1 和 C2 读取 lock.foo 并检查时间戳, SETNX 都返回 0 ,因为它已经被 C3 锁上了,但 C3 在上锁之后就崩溃(crashed)了。
    C1 向 lock.foo 发送 DEL 命令。
    C1 向 lock.foo 发送 SETNX 并成功。
    C2 向 lock.foo 发送 DEL 命令。
    C2 向 lock.foo 发送 SETNX 并成功。
    出错:因为竞争条件的关系,C1 和 C2 两个都获得了锁。



    幸好,以下算法可以避免以上问题。来看看我们聪明的 C4 客户端怎么办:

    C4 向 lock.foo 发送 SETNX 命令。
    因为崩溃掉的 C3 还锁着 lock.foo ,所以 Redis 向 C4 返回 0 。
    C4 向 lock.foo 发送 GET 命令,查看 lock.foo 的锁是否过期。如果不,则休眠(sleep)一段时间,并在之后重试。
    另一方面,如果 lock.foo 内的 unix 时间戳比当前时间戳老,C4 执行以下命令:
    GETSET lock.foo <current Unix timestamp + lock timeout + 1>


    因为 GETSET 的作用,C4 可以检查看 GETSET 的返回值,确定 lock.foo 之前储存的旧值仍是那个过期时间戳,如果是的话,那么 C4 获得锁。
    如果其他客户端,比如 C5,比 C4 更快地执行了 GETSET 操作并获得锁,那么 C4 的 GETSET 操作返回的就是一个未过期的时间戳(C5 设置的时间戳)。C4 只好从第一步开始重试。
    注意,即便 C4 的 GETSET 操作对 key 进行了修改,这对未来也没什么影响。

    这里假设锁key对应的value没有实际业务意义,否则会有问题,而且其实其value也确实不应该用在业务中。

    为了让这个加锁算法更健壮,获得锁的客户端应该常常检查过期时间以免锁因诸如 DEL 等命令的执行而被意外解开,因为客户端失败的情况非常复杂,不仅仅是崩溃这么简单,还可能是客户端因为某些操作被阻塞了相当长时间,紧接着 DEL 命令被尝试执行(但这时锁却在另外的客户端手上)。


    GETSET命令

    语法:
    GETSET key value

    功能:
    将给定 key 的值设为 value ,并返回 key 的旧值(old value)。当 key 存在但不是字符串类型时,返回一个错误。

    时间复杂度:
    O(1)

    返回值:
    返回给定 key 的旧值;当 key 没有旧值时,也即是, key 不存在时,返回 nil 。

    ref by
    http://blog.csdn.net/hpb21/article/details/7893013
    http://redis.readthedocs.org/en/latest/string/setnx.html
    展开全文
  • 唯品会多线程Redis设计与实现

    千次阅读 2016-09-18 08:28:02
    作者:申政,开源爱好者,唯品会高级DBA,主要负责Redis相关领域的源码研究和研发工作。 责编:钱曙光,关注架构和算法领域,寻求报道或者投稿请发邮件qianshg@csdn.net,另有「CSDN 高级架构师群」,内有诸多...

    声明:本文来自京东张开涛的微信公众号(kaitao-1234567),授权CSDN转载,如需转载请联系作者。
    作者:申政,开源爱好者,唯品会高级DBA,主要负责Redis相关领域的源码研究和研发工作。
    责编:钱曙光,关注架构和算法领域,寻求报道或者投稿请发邮件qianshg@csdn.net,另有「CSDN 高级架构师群」,内有诸多知名互联网公司的大牛架构师,欢迎架构师加微信qshuguang2008申请入群,备注姓名+公司+职位。

    本文将向大家分享下我们正在开发的多线程Redis。在我们的Redis使用中,发现了一些痛点问题,涉及到了Redis框架的设计。

    图片描述

    我们线上有大量的Redis实例在运行,规模比较庞大,有些Redis集群实例规模超过100+,我们开始对Redis进行了多线程版本的改造,就是我们现在正在开发的产品Vire。

    图片描述

    这是Vire的一个现状,分几个阶段进行开发,现在是0.1.0版本。

    图片描述

    以上是Vire 0.1.0的一些设计思路。下面说说具体实现:

    图片描述

    这是Vire的多线程模型,借鉴于memcached,master+worker线程模型。

    图片描述

    这个图比较直观的反映了线程模型的工作原理,多线程不可避免会用到锁,以下是Vire的锁机制:

    图片描述

    这里有个逻辑DB的概念,其实就是把多个Redis DB伪装成一个DB提供给用户。DB级别的锁,会不会性能很差呢?后续会有测试报告给出。

    图片描述

    用户使用的所有key,是通过key的Hash值被分散到了各个物理DB上,目的就是降低DB锁的竞争提升QPS,可以通过info命令看到物理db中key的分布:

    图片描述

    下面来看下成功执行一个Redis命令要走的流程:

    图片描述

    我们的DB锁是在哪一步使用呢?

    图片描述

    有可能用到DB锁的步骤就是红框中的两步,但像ping这样命令,在整个过程中是用不到DB锁的,可以看出,Worker线程在一部分时间是完全并行执行的,关于Vire中的后台线程:

    图片描述

    Worker线程专注于处理客户端的请求,杂活累活有backend线程来做,backend线程在Vire后续版本中,会发挥更重要的作用。

    图片描述

    这里是Vire代码内部对object的处理,这里会有些性能退化。

    图片描述

    这是Vire对多key命令的一些特殊处理,死锁的问题,导致个别Redis命令在Vire中暂时无法实现。

    图片描述

    Vire中增加了一些权限管理,Vire增加了管理员的角色,保证了一些危险命令不被开发执行。

    下面说说Vire的测试:

    图片描述

    这里着重说说abtest和性能测试,为了保证Vire的命令执行起来与Redis一模一样,我们开发了abtest测试框架。详细说说abtest框架中各模块的作用:

    图片描述

    图片描述

    这个测试框架有效的帮我们发现了一些bug,以下是性能测试:

    图片描述

    图片描述

    图片描述

    我们的目标就是性能接近或跟mc一样,以下是hotkey测试:

    图片描述

    hotkey的效果还不错。

    Q&A

    1. Q:客户端需要换吗?
      A:客户端兼容,无需更换,使用起来跟原生redis一样

    2. Q:Worker和DB的关系是什么?
      A:Worker和DB没有关系, client是数据Worker线程的, DB是完全独立的

    3. Q:后期主备会支持吗?
      A:以后会支持主备,集群和脚本等高级功能

    4. Q:有没有想过把锁降低至key级别?
      A:没必要key级别的锁

    5. Q:死锁问题为何不通过顺序锁定相关DB来解决呢,我们的Redis是分布式锁,通过按统一的顺序锁定,就可以避免死锁
      A:锁的数量会太多,你说的这个死锁问题很好,有这样的想法,但还没有时间去验证可不可行,以后可以尝试。

    6. Q:Vire和Redis-cluster比起来哪个性能更好?
      A:Redis-cluster是集群模式,Vire是单实例,没办法比较性能,Vire最后一个版本希望能支持到集群

    7. Q:给我的理解Vire的多个逻辑DB的设计原理和Redis-cluster里多个分片原理是一样吧?
      A:非常类似, 只不过Redis-cluster里的slot是海量的,16384

    8. Q:现在Redis-cluster的解决方案是客户端自己计算slot的位置,可以通过根据操作的读写类型,实现负载均衡,Vire采取的多DB+多Worker的方案,他这样的优势在哪里?
      A:主要是提升单个实例的QPS能力

    9. Q:现在的设计是全部基于内存上的?服务器宕机是不是数据全都会消失
      A:Vire0.1.0版本数据全部在内存,只适合于做缓存, Vire后续版本会做持久化和复制,甚至是集群


    2016年9月22日-23日,[SDCC 2016大数据技术&架构实战峰会](http://bss.csdn.net/m/topic/sdcc_invite/hangzhou /)将在杭州举行,两场峰会大牛讲师来自阿里、京东、苏宁、唯品会、美团点评、游族、饿了么、有赞、Echo等知名互联网公司,共同探讨海量数据下的应用监控系统建设、异常检测的算法和实现、大数据基础架构实践、敏捷型数据平台的构建及应用、音频分析的机器学习算法应用,以及高可用/高并发/高性能系统架构设计、电商架构、分布式架构等话题与技术。
    9月5日~18日是八折优惠票价阶段,5人以上团购或者购买两场峰会通票更有特惠,限时折扣,预购从速。(票务详情链接)。

    展开全文
  • 多线程并发问题解决之redis

    多线程并发问题解决之redis锁

    参考文章:

    (1)多线程并发问题解决之redis锁

    (2)https://www.cnblogs.com/love-wzy/p/10190514.html


    备忘一下。


    展开全文
  • 文章目录redis并发读写变慢...最近在最redis + MQ高并发的一个功能,压测时发现redis读写性能突然降低很,而redis已经启用一年,一直没问题,走了点弯路后发现是因为对 JedisPool的高并发处理上存在效率 问题...
  • 背景: 一个中小型H5游戏 核心错误信息:  (1):java.lang.ClassCastException: [B cannot be cast to ... at redis.clients.jedis.Connection.getIntegerReply(Connection.java:201) at redis.clients.jedi...
  • 多线程并发下,将每个线程处理的数据分别存入redis,线程全部执行完毕再依次从redis取出数据 场景:多线程从数据库中查询数据,每个线程在处理完数据后将数据存入redis;线程全部执行结束后从redis中取出数据,...
  • redis并发问题

    2018-03-14 15:22:22
    PHP 多线程 1.redis 加key 赋临时值 线程走完delete掉 A线程执行中 B线程先查临时key 有没有值 (需设置锁过期时间)2.redis 事务 加锁Redis为单进程单线程模式,采用队列模式将并发访问变为串行访问。...
  • 公司某个项目使用了redis进行数据的快速写入与查询,但在测试中发现它的查询速度完全不敌MySQL.经过代码分析发现,我们的架构师来了个奇葩操作.Redis与MySQL的关联,也就是先从Redis中查出相关数据在循环查询MySQL来...
  • Exception in thread “pool-1-thread-5” java.lang.ClassCastException: [B cannot be cast to java.lang.Long at redis.clients.jedis.Connection.getIntegerReply(Connection.java:222) at redis.clients
  • Redis面试题(一): Redis到底是多线程还是单线程?

    万次阅读 多人点赞 2018-04-02 18:18:36
    0.redis线程问题单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有网络请求,其他模块仍用了线程。1.为什么说redis能够快速执行(1) 绝大部分请求是纯粹的内存操作(非常...
  • Redis 并发锁实现

    千次阅读 2018-02-12 09:43:11
    听到Redis 实现并发锁,大家应该都很熟悉了,不知道有多少同学踩过redis并发锁的坑。 最近项目中有同学实现了并发锁,通过代码review还是发现有些同学理解的并不深入,为后续的运行埋下来了巨大的隐患,今天空闲之...
  • 以及今天要谈到的Redis并发竞争问题,这里的并发指的是个redis的client同时set key引起的并发问题。 比如:客户端同时并发写一个key,一个key的值是1,本来按顺序修改为2,3,4,最后是4,但是由于并发设置的原因...
  • Redis并发问题

    2017-05-26 15:29:22
    原文: ... Redis为单进程单线程模式...Redis本身没有锁的概念,Redis对于个客户端连接并不存在竞争,但是在Jedis客户端对Redis进行并发访问时会发生连接超时、数据转换错误、阻塞、客户端关闭连接等问题,这些问题均
  • 这里的并发指的是redis的client同时set key引起的并发问题。 2.出现并发设置Key的原因 Redis是一种单线程机制的nosql数据库,基于key-value,数据可持久化落盘。由于单线程所以Redis本身并没有锁的概念,个...
  • redis客户端驱动有很多,如ServiceStack.Redis,StackExchange.Redis等等,下面我使用ServiceStack.Redis为例,介绍一下在redis驱动中实现并发锁的方式,并发就是多线程同时访问和操作同一个资源,而对于redis来说,...
  • 需求由来 1.Redis并发的问题 ...这里的并发指的是redis的client同时set key引起的并发问题。 2.出现并发设置Key的原因 Redis是一种单线程机制的nosql数据库,基于key-value,数据可持久化落盘。由...
  • 2.redis是单线程的,省去了很上下文切换线程的时间; 3.redis使用路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了...
  • 先说下为什么redis会存在并发问题,redis不是单线程吗,不管你多少个请求过来,我就只有一个线程,讲道理永远不会出现并发问题; 但上述情况仅适用于单机系统,如果是个系统并发操作redis,就有可能造成数据丢失、...
  • 这几天无聊看了一下rabbitMQ队列,想着结合Redis的递减功能做一个商城秒杀系统(支持并发)。自己弄了一天半的时间总算差不多懂了(ps:只是运行过程和逻辑,至于rabbitMQ的原理还没怎么深入研究,以后有时间在看吧...
  • 在所线程并发的条件下,特别是做电商项目的时候出现高并发怎么解决这些问题? 一、缓存穿透 缓存穿透,是指我们本应该让用户去缓存中查询获取的数据,结果却去数据库中查询,造成我们数据库的压力过载。这种情况只...
  • 关于Redis并发更新key的问题

    千次阅读 2020-07-20 22:31:23
    Redis并发更新key的问题,主要指的是线程对同一个key的set操作,这种问题就如同在java中对同一个资源的并发访问一样。 问题场景 1、某个值先从redis中取出,然后再修改,比如一个线程取出值为1,然后+1后更新,...
  • import entity.User; import org.junit.Test; import redis.clients.jedis.Jedis; import java.sql.*;...import java.util.LinkedList;... * @描述 队列解决高并发redis,缓存与数据库不一致问题 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 102,471
精华内容 40,988
关键字:

多线程redis并发

redis 订阅