首页 > 数据库 >redis访问时的线程安全问题

redis访问时的线程安全问题

时间:2023-07-26 13:22:56浏览次数:48  
标签:命令 epoll 单线程 访问 redis 安全 线程

  参考:https://blog.csdn.net/diweikang/article/details/90264993

 

Redis 是线程安全的吗?

  Redis 是个单线程程序,所以它是线程安全的。

 

Redis 单线程为什么还能这么快?

  • redis 是基于内存的,内存的读写速度非常快
  • redis 是单线程的,避免了不必要的上下文切换和竞争条件
  • redis 使用多路复用技术,可以处理并发的连接。非阻塞 IO 内部实现采用 epoll,采用了 epoll + 自己实现的简单的时间框架。epoll 中的读、写、关闭、连接 都转化成了事件,然后利用 epoll 的多路复用特性,在 io 上没有浪费

 

redis 多路复用的理解

  https://www.cnblogs.com/histlyb/p/12155934.html

 

 

 

  开发中遇到一个这样的问题,统计一个页面的点击次数和平均停留时间。

  想到用 redis 做暂存,后再通过定时器计算每天的数据量并入库。

 

  但是多个请求下 redis 操作【点击次数】这样的数据,是否会有线程安全问题?

 

  redis 是单线程运行,所以多个 redis 命令是一个一个执行,所以是线程安全的。

  但是分开的两个 redis 命令,对于【应用】不是线程安全的,因为这两个 redis 命令之间会有其他的命令,就像 java 线程不安全的 i++ 操作,这两个 redis 命令没有事务管理

  可以用 RPOP、LPUSH 和 INCR,或者 lua 脚本,实现多个 redis 操作合为一个命令,这样就对【应用】线程安全了。

 

  redis 集群中的 master 是写库,slaver 是读库。每个 master 和 slaver 都有主线程,主线程负责接收请求,重定向请求到对应的服务器,同时对没有重定向的请求,放到队列中由子线程处理。

 

 

  https://www.cnblogs.com/liuqing576598117/p/10593787.html

标签:命令,epoll,单线程,访问,redis,安全,线程
From: https://www.cnblogs.com/lili-xia/p/12505228.html

相关文章

  • SpringBoot中定时任务开启多线程避免多任务堵塞
    场景SpringBoot中定时任务与异步定时任务的实现:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/117083609使用SpringBoot原生方式实现定时任务,已经开启多线程支持,以上是方式之一。除此之外还可通过如下方式。为什么SpringBoot定时任务是单线程的?查看注解@Ena......
  • Redis实现消息队列
    Redis基于内存,高性能并且提供多种数据结构供使用,那么对于Redis能不能作为消息队列?以及与专业的消息队列,如RocketMQ,Kafka等差距又在哪里?Redis提供多种方式实现消息队列,基于List,基于Pub/Sub等,如今基本广泛使用的是Redis5.0之后推出的Stream流格式,其具有支持持久化,支持消......
  • 链表只有面试有用?Redis 之父说:我不同意
    几天前,Redis之父 SalvatoreSanfilippo(又名antirez)在Twitter上用Rust实现了一个糟糕的链表,引发了大家的讨论。在评论中,不少人觉得链表这种数据结构一无是处,于是几天后,antirez发了一篇博客。原文见:http://antirez.com/news/138antirez说:“从某些评论的语气中,我感觉到很多人......
  • redis学习二十:redis哨兵监控
    是啥:吹哨人巡查监控后台master主机是否故障,如果故障了根据投票数自动将某一个从库转换为新主库,继续对外服务。作用:1.监控redis运行状态,包括master和slave2.当master宕机,能自动将slave切换成新master能干啥:主从监控:监控主从redis库运行是否正常消息通知:哨兵可以将故障转移的......
  • Redis的有序集合Zset为啥用跳表不用二叉树
    跳表和红黑树查找的时间复杂度都是logN,插入删除也是logN。范围查找貌似也都是O(k+logn),其中n是树中节点的数量,k是满足范围条件的节点数量。但是实现起来跳表要简单很多。1.zset有个很核心的操作叫范围查找,我们要查找某个范围区间的元素。跳表可以做到logN时间复杂度内的快......
  • cookie+session(这里使用redistemplate代替)实现单点登录流程
     user发起资源请求(带上回调的路径方便回调),通过判断是否浏览器的cookie中是否存在登录过的痕迹,比如有人登了,然后存了一个cookie到浏览器如果拿到了cookie是有东西的,则带上这个cookie的内容返回给client,如果没有东西,则继续登录,向session中存入userInfo,并给浏览器设置cookie......
  • k8s使用token访问集群apiserver
    exportTOKEN=eyJhbGciOiJSUzI1NiIsImtpZCI6InRjMEs2b2tyVUFjdHZuazNTS1VrM0s3LWFHMlVjek5NTUJnVUVSTTVHQnMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJzaGlvcmlrbyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY29......
  • Android 多线程编程 - 线程的基本使用
    1.线程的状态New:新创建状态。线程被创建,还没有调用start方法,在线程运行之前还有一些基础工作要做。Runnable:可运行状态。一旦调用start方法,线程就处于Runnable状态。一个可运行线程可能正在运行,也可能没有运行,这取决于操作系统给线程提供运行的时间。Blocked:阻塞状态。表示线程被......
  • Python time模块和datetime模块,以及多线程
    1.time模块1.1time.time()函数time.time()函数返回自1970年1月1日0点到现在的秒数。纪元时间戳可以用于剖析代码,也就是测量一段代码的运行时间。如果在代码块开始时调用time.time(),并在结束时再次打开,就可以用第二个时间戳减去第一个,得到这两次调用之间经过的时间。......
  • redis 取出指定集合
    Redis取出指定集合Redis是一种高性能的键值存储数据库,它支持多种数据类型,包括字符串、哈希、列表、集合和有序集合。在Redis中,集合是一种无序且唯一的数据结构,它可以存储多个元素。本文将介绍如何在Redis中取出指定集合的元素,并提供相关代码示例。Redis集合Redis集合是一个无序......