redis缓存小结

redis是一个NoSQL数据库,其在当今的互联网公司有着和传统数据库相辅相成的角色。今天来对其进行小结一下。
在写这个小结时,我已工作两年了,也就是说已经使用了两年redis(虽然公司内部使用的是运维同学的r2m集群,在京东的同学应该都知道,其底层就是redis)。所以这里不会说怎么起下载安装了,介绍redis的五种数据类型了。这在网上一查一大把,这都是最基础的使用了 string list set zset hash。
比起常用的数据操纵命令,这里主要说说redis的事务操纵,redis的发布订阅(项目中一直在用,可以和消息中间件对比学习一下),以及redis的分布式锁的使用,最后顺便说说pipline的使用。学习任何一个技术,首先扒拉一下官方文档。
Programming with Redis
The full list of commands implemented by Redis, along with thorough documentation for each of them.
Pipelining: Learn how to send multiple commands at once, saving on round trip time.
Redis Pub/Sub: Redis is a fast and stable Publish/Subscribe messaging system! Check it out.
Redis Lua scripting: Redis Lua scripting feature documentation.
Debugging Lua scripts: Redis 3.2 introduces a native Lua debugger for Redis scripts.
Memory optimization: Understand how Redis uses RAM and learn some tricks to use less of it.
Expires: Redis allows to set a time to live different for every key so that the key will be automatically removed from the server when it expires.
Redis as an LRU cache: How to configure and use Redis as a cache with a fixed amount of memory and auto eviction of keys.
Redis transactions: It is possible to group commands together so that they are executed as a single transaction.
Mass insertion of data: How to add a big amount of pre existing or generated data to a Redis instance in a short time.
Partitioning: How to distribute your data among multiple Redis instances.
Distributed locks: Implementing a distributed lock manager with Redis.
Redis keyspace notifications: Get notifications of keyspace events via Pub/Sub (Redis 2.8 or greater).
Creating secondary indexes with Redis: Use Redis data structures to create secondary indexes, composed indexes and traverse graphs.
上述内容来自redis的官方文档:
1.redis是所有实现的命令列表。
2.redis的pipline
3.redis的pub/sub命令
4.redis的lua脚本
5.redis debug
6.redis内存优化
7.redis的过期
8.redis的lurkey淘汰算法
9.redis的事务
10.redis的大数写入
11.redis的数据在集群上的分片
13.redis分布式锁
。。。

pipline

using piplining to speedup redis queryies
官方第一句话说的就是,使用pipline的目的就是为了加快查询。redis的本质是一个tpc的client/server模型,也就是说,一个查询请求到达服务端了,然后等待服务端处理了,然后把数据再返回给客户端。这个从请求发出到接收到服务端返回的消息这段时间就是往返时延。
pipline就是跳过请求-等待-响应的这种模式,即使你一个请求没有被处理完也可以继续发请求,这样就是在客户端不等待响应的情况下可以继续向服务端发送请求。在最终给你返回你本次这批请求的结果。
Client: INCR X
Client: INCR X
Client: INCR X
Client: INCR X
Server: 1
Server: 2
Server: 3
Server: 4
这种情况下就不需要为每次请求都等待了,缩短了往返延时。
pipline不仅仅是在往返延时上进行改善,从服务器的角度也能大量的降低cpu的使用率,比如,你有1000个请
求,原来需要1000次,现在只需要一次了。

      try {
            jedis = new Jedis("10.10.224.44", 6379);
            Pipeline pipline = jedis .pipelined();
            for(int i =0; i<1000; i++){
                 pipline .incr("hello");
            }
            pl.sync();
        } catch (Exception e) {
            ...
        }

pub/sub

redis的pub/sub其实就是一个消息的发布和监听的方式,把消息的发布者和接收者进行解耦。
实际使用案例:
在用lucene做搜索的时候,由于生产索引只是在一台上生产,所以,需要把索引从生产的这台机器上分别放在每一个实例的机器上,那么问题来了,该怎么告诉那些机器我生产好了呢?这里就可以使用这个命令。

  if(索引生产出来了)
    then pub(在指定的频道发布了一个消息)

  继承了jedis subscribe
  if(消息来了)
    then 我就去你的机器上复制了

在现在消息中间件大行其道的环境下,还是不推荐使用这种方式来进行小心通讯,消息对于发布者来说是发布即消失,订阅者需要有线程一直来监听消息的发布。使用mq消息来替代这种方式,

redis 事务

在一个队列中,一次性的,顺序的,排它的执行一系列命令。
DISCARD
EXEC
MULTI
UNWATCH
WATCH
discard 放弃本次事务
multi 开启事务,通常返回一个OK(open session)开启事务后,每次一次操作都是入队,知道exec,所有队列的命令才会被提交的。
exec 执行事务(commit)
watch 监视一个或者多个key
unwatch 取消watch对所有key的监视
multi --> set a 1 set b 2 set c 3 --->exec
watch特别说明。比如我watch的时候,用户的账户余额100块,在你自己处理一系列后,还是100块,提交的时候就没问题。如果在这个watch期间被别人修改过了,那么在watch提交会告诉你失败了。
redis对事务的支持是部分支持的,因为它是先吧所有命令放在执行队列中,只有执行的时候才知道能不能执行成功:
multi -->set a aa incr a set b 1--exec
这个命令执行完成后,只有b=1能成功,因为a 的value string类型的无法进行加一操作,但是redis在未执行的时候是不知道的,所以只有在执行了,才知道是败了,所以第一条命令失败了但是第二条set b 1是合法的,是能执行成功的。
所以,redis对事务的支持是部分支持。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • 1.1 资料 ,最好的入门小册子,可以先于一切文档之前看,免费。 作者Antirez的博客,Antirez维护的R...
    JefferyLcm阅读 17,050评论 1 51
  • 安全性 设置客户端连接后进行任何其他指令前需要使用的密码。 警告:因为redis 速度相当快,所以在一台比较好的服...
    OzanShareing阅读 1,714评论 1 7
  • 本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍。之后概...
    kelgon阅读 61,158评论 23 625
  • # redis 配置文件示例 # 当你需要为某个配置项指定内存大小的时候,必须要带上单位, # 通常的格式就是 1...
    iyimao阅读 798评论 0 2
  • # redis 配置文件示例# 当你需要为某个配置项指定内存大小的时候,必须要带上单位,# 通常的格式就是 1k ...
    谁在烽烟彼岸阅读 358评论 0 0