妈妈再也不用担心别人问我是否真正用过redis了
1. Memcache与Redis的区别
1.1. 存储方式不同
1.2. 数据支持类型
1.3. 使用底层模型不同
2. Redis支持的数据类型
3. Redis的回收策略
4. Redis小命令
4.1. 连接
4.2. MONITOR
4.3. SLOWLOG
4.4. INFO
5. 应用场景
5.1. 缓存
5.2. 对用户访问某个API进行频率限制
5.3. 批量获取key
5.4. 用户属性存储
5.5. 实现计数器
5.6. 分布式锁
5.7. 取最新N个数据的操作
5.8. 排行榜
5.9. 用户未读消息列表
5.10. 黑名单、关注列表、粉丝列表、双向关注列表
5.11. Uniq操作,获取某段时间所有数据排重值
5.12. 用setbit(bitmap)统计每天活跃用户
5.13. 队列
5.14. Pub、Sub构建实时消息系统
5.15. LBS应用
6. 扩展阅读
持续更新…
Redis最近几年很火。笔者很羞愧,很长时间内以为和Memcache一样,只能做缓存。事实上Redis功能丰富,十八般武艺样样具全,几乎适用于互联网行业的各个场景,包括存储。但Redis存储相当的贵,而且大文件不适合这种场景。
Redis从设计到运维到使用,都是很大的话题,在面试中被问到的概率越来越大,大部分都是使用问题。简单的了解以下内容,妈妈再也不用担心别人问我是否真正用过redis了。
Memcache与Redis的区别
现在的硬盘速度很不给力,所以才有了各种各样的缓存,redis最初是作为缓存设计的,相对于另一个缓存大明星Memcache,它们有以下不同。
存储方式不同
Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。
Redis有部份存在硬盘上,这样能保证数据的持久性。
数据支持类型
Memcache对数据类型支持相对简单。
Redis有复杂的数据类型。可以玩很多花样。
使用底层模型不同
它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。
Redis直接自己构建了VM机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
Redis支持的数据类型
Redis支持5种数据类型strings, hashes, lists, sets, sorted sets
strings 简单字符串,底层使用sds实现
lists 简单列表,按照需求,底层使用双向链表(linkedlist)或者压缩列表(ziplist)实现
sets 无序set,底层存储使用intset或者hashtable
sorted sets 有序set,底层使用压缩列表或者”跳跃表+哈希”实现
hashes 哈希表,按照需求,底层使用压缩列表或者哈希表实现
Redis的回收策略
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据
Redis小命令
其他命令参考http://redisdoc.com
连接
#连接上redis_001.jr-jr.com,指定host和port |
MONITOR
MONITOR是一个调试命令,返回服务器处理的每一个命令,它能帮助我们了解在数据库上发生了什么操作。配合grep可以查看是否有你想要的操作。
由于MONITOR命令返回服务器处理的所有的命令, 所以在性能上会有一些消耗。
redis-cli -h redis_001.jr-jr.com -p 3306 monitor | grep "nnn" |
SLOWLOG
通过SLOWLOG可以读取慢查询日志。
使用SLOWLOG LEN就可以获取当前慢日志长度。
使用SLOWLOG GET N就可以获取最近N条慢日志。
使用SLOWLOG RESET命令重置慢日志。一旦执行,将丢失以前的所有慢日志。
INFO
详细信息可以看这里
http://redis.io/commands/info
http://redisdoc.com/server/info.html
主要关注Memory帧
used_memory : 由 Redis 分配器分配的内存总量,以字节(byte)为单位
used_memory_rss : 从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)。这个值和 top 、 ps 等命令的输出一致。
rdb_changes_since_last_save 如果频繁进行save操作,会引起redis卡顿,需要定位
connected_clients 有多少个客户端连接,看详细列表可以使用CLIENT LIST
instantaneous_ops_per_sec 另外关注ops,达到2w需要高度关注
keyspace_hits
keyspace_misses 缓存命中,顾名思义,被当作缓存使用时有意义
应用场景
进入我们的主旋律,怎么运用redis,具体redis的运维,交给专业DBA吧。不明白的redis指令,希望自己能查查。
啊啊啊啊,妈妈再也不用担心别人问我是否用过redis了。
缓存
对热点数据进行缓存,比如经常访问的用户资料等。内存价位较高,配合设置过期时间,效果更佳。
对用户访问某个API进行频率限制
比起各种分布式协调方案,使用Redis简单多了。
批量获取key
当你的Redis运行在大循环中,使用MGET
、MSET
会有意想不到的效果。这是SQL的Batch模式。
用户属性存储
使用大JSON或者HSET
、HGET
操作HASH,其中,某个属性也可以使用HINCRBY
自增哦,牛逼吧。
实现计数器
用来实现 用户: 总点赞数,关注数,粉丝数;帖子: 点赞数,评论数,热度;消息: 已读,未读,红点消息数; 话题: 阅读数,帖子数,收藏数
使用INCR
即可解决。原子的哦。
但具体的应用场景亦有它的复杂性[转]微架构设计:微博计数器的设计 http://blog.csdn.net/heiyeshuwu/article/details/7972050
分布式锁
通过SETNX
来实现锁的获取,通过设置TTL
来设置超时时间,通过DEL
完成锁的释放。
例如:
加锁:SETNX foo.lock <current unix time>
释放锁:DEL foo.lock
扩展问题:怎么检测死锁,并解决它呢?自己搜索一下吧。
取最新N个数据的操作
使用LPUSH
插入
使用LTRIM
让列表只保存前N条
排行榜
使用有序的SET
,比如,得到前100名高分用户很简单:ZREVRANGE leaderboard 0 99
同理,可以使用ZREMRANGEBYRANK
让有序集合保存前N条
例子 http://segmentfault.com/a/1190000002694239
用户未读消息列表
使用SADD
、SCARD
、DEL
等
黑名单、关注列表、粉丝列表、双向关注列表
使用ZADD
、ZRANK
等,将用户的黑名单使用ZADD添加,ZRANK使用返回的sorce值判断是否存在黑名单中
Uniq操作,获取某段时间所有数据排重值
这个使用Redis的set数据结构最合适了,只需要不断地将数据往set中扔就行了,set意为集合,所以会自动排重。更何况有SUNION
等合并两个集合的命令。
用setbit(bitmap)统计每天活跃用户
Bitmap是一串连续的2进制数字(0或1),每一位所在的位置为偏移(offset),在bitmap上可执行AND,OR,XOR以及其它位操作。
每一位标识一个用户ID。当某个用户访问我们的网页或执行了某个操作,就在bitmap中把标识此用户的位置为1。
使用SETBIT
、GETBIT
、BITCOUNT
等。
队列
LPUSH
和RPOP
命令。
如果要实现任务队列,只需要让生产者将任务使用LPUSH命令加入到某个键中,另一边让消费者不断地使用RPOP命令从该键中取出任务即可。
RPOP是阻塞的,如果想要非阻塞队列,使用BRPOP
。
Pub、Sub构建实时消息系统
Redis 的 Pub/Sub 系统可以构建实时的消息系统,比如很多用 Pub/Sub 构建的实时聊天系统的例子
LBS应用
Redis3.2将推出GEO功能,将会是除了PostGIS
以外有力的开源解决方案。更多功能期待ing…
可以实现:
两个位置之间的距离
查找附近的人
摇一摇
Redis通过组合,可以实现N多功能,如果你有更好的方法,请及时告诉我。
扩展阅读
关于Redis的常识 http://blog.csdn.net/andy1219111/article/details/18984355
Redis GEO 特性简介http://blog.jobbole.com/89225/
版权声明(by lycying@gmail.com):
复制文章的时候,把这一段也复制上吧。这里是Java面试指南,最全最前沿的面试题。大部分信息来自网络和书籍,整理加工而成,也有不少部分是作者自己的观点,一字一字打的,总之,可随意转载。要是能保留链接,感激不尽。如果你不希望被转载的文章不幸出现在这里,请留言告诉我,我换种说法 :)
扫描下面的二维码,加入微信公众号,得到最新的资料:
妈妈再也不用担心别人问我是否真正用过redis了的更多相关文章
- python爬虫07 | 有了 BeautifulSoup ,妈妈再也不用担心我的正则表达式了
我们上次做了 你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍 有些朋友觉得 利用正则表达式去提取信息 太特么麻烦了 有没有什么别的方式 更方便过滤我们想要的内容啊 emmmm 你还别说 还 ...
- 有了 tldr,妈妈再也不用担心我记不住命令了
引言 有一次我在培训时说「程序员要善于使用 Terminal 以提高开发效率」,一位程序员反驳道:「这是 21 世纪,我们为什么要用落后的命令行,而不是先进的 GUI?」 是的,在一些人眼里,这个黑黑 ...
- 妈妈再也不用担心我使用git了
妈妈再也不用担心我使用git了 Dec 29, 2014 git git由于其灵活,速度快,离线工作等特点而倍受青睐,下面一步步来总结下git的基本命令和常用操作. 安装msysgit 下载地址:ms ...
- 利用CH341A编程器刷新BIOS,恢复BIOS,妈妈再也不用担心BIOS刷坏了
前几天,修电脑主析就捣鼓刷BIOS,结果刷完黑屏开不了机,立刻意识到完了,BIOS刷错了.就从网上查资料,各种方法试了个遍,什么用处都没有.终于功夫不负有心人,找到了编码器,知道了怎么用.下面看看具体 ...
- 锋利的js之妈妈再也不用担心我找错钱了
用js实现收银功能. <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <hea ...
- 有了jsRender,妈妈再也不用担心我用jq拼接DOM拼接的一团糟了、页面整齐了、其他伙伴读代码也不那么费劲了
写在前面 说来也很巧, 下午再做一个页面,再普通不过的分页列表,我还是像往常一样,基于MVC环境下,我正常用PagedList.MVC AJAX做无刷新分页,这时候问题就来了,列表数据中有个轮播图用到 ...
- 【C#】妈妈再也不用担心自定义控件如何给特殊类型的属性添加默认值了,附自定义GroupBox一枚
------------------更新:201411190903------------------ 经过思考和实践,发现套路中的第1条是不必要的,就是完全可以不用定义一个名为Default+属性名 ...
- 妈妈再也不用担心我的移动端了:网易和淘宝的rem方案剖析
从博主学习前端一路过来的经历了解到,前端移动开发是大部分从PC端转战移动端的小伙伴都非常头疼的一个问题,这边博主就根据一篇自己看过的移动开发文章来剖析一下网易和淘宝的rem解决方案,希望能够帮助到一些 ...
- 使用EXCEL绘制三维地图(超简单的五分钟绘制地图方法,妈妈再也不用担心我不会画地图啦~)
博主为从区域规划转行地图学的小学渣一枚,最近处理数据希望对结果进行三维可视化,意外发现从小用到大的EXCEL可以绘制地图且功能非常强大,在这里做一下简单介绍,希望可以给看官提供些许帮助.那下面就开始吧 ...
随机推荐
- 在文件夹中 的指定类型文件中 查找字符串(CodeBlocks+GCC编译,控制台程序,仅能在Windows上运行)
说明: 程序使用 io.h 中的 _findfirst 和 _findnext 函数遍历文件夹,故而程序只能在 Windows 下使用. 程序遍历当前文件夹,对其中的文件夹执行递归遍历.同时检查遍历到 ...
- 2.一个EJB的小Demo
新建一个java普通项目即可 这里用到了Jboss,需要安装Jboss,然后进入jboss-4.2.3.GA\client目录,拷贝所有的jar包到本项目的lib下. 3个接口分别如下所示: publ ...
- 数据库_MYSQL
数据库简介 数据库分类:关系型数据库.非关系型数据库 常用的关系型数据库有:orcale .mysql .sql server等等 常用的非关系型数据库有: Memcached.redis.mong ...
- jquery.lazyload 实现图片延迟加载jquery插件
看到了淘宝产品介绍中,图片是在下拉滚动条时加载,这是一个很不错的用户体验.减少了页面加载的时间了,也减轻了服务器的压力,就查了下用JQuery.. 什么是ImageLazyLoad技术 在页面上图 ...
- 【jQuery】scroll 滚动到顶部
Jquery 实现页面滚动到顶端 $(document).ready(function () { // 滚动窗口来判断按钮显示或隐藏 $(window).scroll(function () { // ...
- Android 在非Activity的类中调用startActivityForResult
http://www.360doc.com/content/11/0720/10/7322578_134657348.shtml
- [转]ExtJS之遍历Store
原文地址:http://blog.sina.com.cn/s/blog_67cc6e7d0100ox6u.html ExtJS中,一般很少需要遍历Store,因为它的selectModel很好用,无论 ...
- python-实现生产者消费者模型
生产者消费者:包子铺不停的做包子,行人不停的买 ---> 这样就达到了目的--->包子的销售 两个不同的角色 包子铺,行人 只负责单一操作 让包子变成连接的介质. #_*_coding:u ...
- git-添加公钥
安装完git后,打开开git bush 输入以下命令 git config --global user.name "Your Name" git config --global u ...
- js限制输入框只能输入数字
分享下js限制输入框中只能输入数字的方法,包括整数与小数,分享几个例子,有需要的朋友参考下. 1.使用正则表达式限制输入框只能输入数字: <input type="text" ...