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

posted @ 2023-07-26 13:17  停不下的时光  阅读(151)  评论(0编辑  收藏  举报