程序员眼中的Redis
Redis 是用C语言编写的内存中的数据结构存储系统,可以用来作数据库、缓存、消息中间件.
数据结构
字符串(strings):值是任何种类的字符串
散列(hashs):值是map 字典,数组+链表,不管读多还是写多都能很好的性能
列表(lists):链表或队列或栈
集合(sets):无序集合,可用交集、差集、并集
有序集合(sorted sets):有序集合
Key设计技巧
可以类比表设计方法,比如 表名:主键:字段名
key 不要设计太长也不要太短
分布式锁
在分布式系统里面,我们常常是先执行查询,如果查出结果满足条件则执行更新或插入等操作,因为查询是无锁状态,查询和更新或插入又不是原子操作,所以会出现幻读或脏读,即并发问题,以至影响我们的业务,比如对库存、积分、优惠劵等关键数据的控制;Redis 为我们提供 setnx (set if not exists )指令,来实现分布式锁效果,在同一时间只能有一个客户端访问处理数据,其它客户端进行等待,直到指定的expire 过期,对expire 要慎重设置,记住分布式锁是悲观锁,且无法解决超时问题.
事务
Redis 事务命令是multi 类似于开始事务;exec 类似于提交事务;discard 类似于回滚事务; 严格意义上不支持事务,因为它不满足事务的原子性原则,并且不支持回滚操作,即没有操作前的日志记录,如果使用事务,里面有个规则是执行多个命令语句,有任意一个命令语句错误(比如 set 命令写成 met ),则做exec 时全部命令执行失败,如果全部命令编写成功则做exec 时即便是执行失败的情况则也会有执行成功的命令,这个规则对于开发人员来说透明,因为开发人员更多的是通过封装的库或中间件来操作Reids ; 另外记住Redis 提供 Watch 命令来对key进行监控,即可实现乐观锁.
持久化
rdb Redis 通过多进程机制来实现快照持久化(rdb),在持久化时会fork 一个子进程来对数据进行读取并存到磁盘中,由于会遍历读取内存写磁盘所以会比较消耗服务器资源,由于不是实时保持数据且操作有可能持续比较长,所以会丢数据及重启服务数据比较慢.
aof 是重放redis 命令;底层是执行 操作系统的 fsync 函数来写磁盘,但是fsync 操作性能比较慢,所以Redis 有三种规则包含来调用fsync :
1.定时调用
2.决不调用
3.执行一个命令就调用一次
另外 aof 文件会比较长的问题,可以定期通过bgrewriteaof命令来减少aof 的长度.
在实际使用当中,可以rdb 和 aof 混合使用提高重启效率,且多从库做持久化避免丢失数据.
限流
使用 Redis-Cell 模块实现漏斗算法限流.限流算法有两个关键点:一个是漏斗初始化容量,一个是限流最大限流速率(单位时间内请求量).
单线程
Redis 虽然是单线程但性能非常好,可了解下IO的多路复用模型,虽然Redis是单线程,但并不是一个线程,而且有些操作是异步线程完成的,比如 key 的过期策略,超过最大虚拟内存时使用的LRU 清除key 算法策略,持久化 等都使用了异步线程;另外记住这些Redis 命令在生产环境请禁用;keys*,del key ,flushdb , flushall ,aof 等;因为这些命令有可能会导致Redis 卡顿.
tags: lru、过期key、内存数据库、异步线程、多路复用、哨兵、集群
长按或扫码关注查看更多文章
程序员眼中的Redis的更多相关文章
- 程序员眼中的 SQL Server-执行计划教会我如何创建索引?
先说点废话 以前有 DBA 在身边的时候,从来不曾考虑过数据库性能的问题,但是,当一个应用程序从头到脚都由自己完成,而且数据库面对的是接近百万的数据,看着一个页面加载速度像乌龟一样,自己心里真是有种挫 ...
- 应用程序员眼中的数据库管理系统:API+数据库语言
应用程序员眼中的数据库管理系统:API+数据库语言 sqlite3_open_v2 https://www.cnblogs.com/cchust/p/5121559.html
- 面试中程序员常见的Redis"刁难"问题,值得一读!
导读 在程序员面试过程中Redis相关的知识是常被问到的话题.作为一名在互联网技术行业打击过成百上千名的资深技术面试官,总结了面试过程中经常问到的问题.十分值得一读. Redis有哪些数据结构? 字符 ...
- 程序员眼中的 SQL Server-非聚集索引能给我们带来什么?
写在前面 最近在做的一个项目,页面访问的时候很慢(大概几秒钟的样子),然后用日志记录的方式,来排查这个问题,最后发现是 Entity Framework 初始化的一个坑(大概要花 6-7 秒),详见: ...
- 一个程序员眼中的好UI
最近接到一个项目发来的UI设计图,我觉得她给的材料很专业,特此分享. 发的RAR压缩包里面有一个images目录,里面放的都是切片好的图片. 图片切片基本上都是靠近边线切的,边上留的空白很少,这样切的 ...
- 程序员眼中的UML
--克服用例图的恐惧 在实际工作中,大部分程序员很少接触到需求分析,即使有需求分析,也是草草了事,没有用正规的方式来表达,所以一般程序员使用用例图的机会是不多的.但是却又常常在各种媒体上看见用例图,于 ...
- 混合开发的大趋势之 一个Android程序员眼中的 React.js 块级作用域 和 let
转载请注明出处:王亟亟的大牛之路 最近都有事干然后,快到月底了这个月给CSDN的博文也就两篇,想想也蛮多天没更了,那就来一篇. 老规矩,先安利:https://github.com/ddwhan012 ...
- 一个iOS程序员眼中的跨域问题
摘要: 跨域问题是web开发领域一个常见的问题,相信每个web开发者都遇到"跨域"的问题 最近公司的iOS开发任务比较少,所以自己最近开始了Web开发的任务,在用H5做了很多页面, ...
- Android程序员眼中世界上最遥远的距离
世界上最遥远的距离,是我在if里你在else里,似乎一直相伴又永远分离: 世界上最痴心的等待,是我当case你是switch,或许永远都选不上自己: 世界上最真情的相依,是你在try我在catch. ...
随机推荐
- unresolved external symbol boost::throw_exception
使用boost库,VS生成的时候一直报错, error LNK2019: 无法解析的外部符号 "void __cdecl boost::throw_exception(class std:: ...
- Fiddler抓包学习——https请求的抓取
第一步:设置Fiddler windows下安装证书 打开fiddler 查看证书是否安装 说明已安装成功 设置端口号(下面手机设置代理所需要的) 第二部 手机端安装证书 通过fiddler查看电 ...
- 洗礼灵魂,修炼python(56)--爬虫篇—知识补充—编码之url编码
其实在最前面的某一篇博文里,是绝对提过编码的,有ASCII,有UTF-8,有GB2312等等,这些我绝对说过的. url编码 首先,Http协议中参数的传输是"key=value" ...
- 第三章 Hyper-V 2012 R2配置选项
原书中的第二章 是介绍了下hyper-v的管理器和检查点的使用,导入导出虚拟机,所以我跳过了不高兴写,很简单.直接进入第三部分,介绍虚拟机的三个重要组成部分:CPU,内存,硬盘的配置选项. Hyper ...
- Requests 校花网图片爬取
纪念我们闹过的矛盾,只想平淡如水 import requestsimport reurl = 'http://www.xiaohuar.com/list-1-%s.html'for i in rang ...
- [BZOJ 3829][POI2014] FarmCraft
先贴一波题面... 3829: [Poi2014]FarmCraft Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 421 Solved: 197[ ...
- 从研发到市场,一个C#程序员半年神奇之旅
序 距离上次在博客园发布文章已经过了大约有一年了,由于最近一系列神奇的际遇,让我非常强烈意愿的提起笔来给大家描述我最近一段时间的经历,希望大家根据我的经历做一些参考,我尽量写的逻辑通顺,如果各位兄弟阅 ...
- 捕获海康威视IPCamera图像,转成OpenCV能够处理的图像(二)
海康威视IPCamera图像捕获 捕获海康威视IPCamera图像.转成OpenCV能够处理的IplImage图像(一) 捕获海康威视IPCamera图像.转成OpenCV能够处理的IplImage图 ...
- 移动端 Retina屏border实现0.5px
首先来看一下造成Retina边框变粗的原因 其实这个原因很简单,因为css中的1px并不等于移动设备的1px,这些由于不同的手机有不同的像素密度.在window对象中有一个devicePixelRat ...
- 转://Oracle 11gR2 RAC ASM磁盘全部丢失后的恢复
一.环境描述 (1)Oracle 11.2.0.3 RAC ON Oracle Linux 6 x86_64,只有一个ASM外部冗余磁盘组--DATA: (2)OCR,VOTEDISK,DATAFIL ...