点滴记录——学习Redis笔记,点滴redis笔记
转载请说明出处:http://blog.csdn.net/cywosp/article/details/39701409
Redis适用场景
1. 取最新N个数据的操作 2. 排行榜应用,取TOP N操作 3. 需要精确设定过期时间的应用 4. 计数器应用 5. Uniq操作,获取某段时间所有数据排重值 6. 实时系统,反垃圾系统 7. Pub/Sub构建实时消息系统——消息的发布与订阅 8. 构建队列系统 9. 缓存Redis数据类型 Strings类型及操作
String是最简单的类型。一个Key对应一个Value,String类型是二进制安全的。Redis的String可以包含任何数据,比如jpg图片或者序列化的对象。
set key value get key setex key time_seconds value 设置key对应的值为String类型的value,并指定此键值的有效期 setnx key value 如果key不存在才设置value,否则返回0 setrange key offset replace_value 设置指定key的value值的子字符串,成功返回替换后的字符串总长度,如果原先的key不存在,则创建,返回offset+strlen(replace_value),其具有替换功能 set email cynric@apusapp.com
setrange email 7 sina //从email的第8(从1开始)个字符开始替换成sina get email cynric@sinaapp.com
get em (nil) setrange em 3 aaa (integer) 6 get em "\x00\x00\x00aaa" mset key1 value1 key2 value2 ... 设置多个key,成功返回ok,失败返回0,所有值都不会成功 msetnx 一次设置多个key的值,成功返回ok表示所有的值都设置了,失败返回0表示没有任何值被设置,但是不会覆盖已存在的key。(只要有一个没成功,其他的也不会成功) msetnx key1 value1 kye2 value2 ... getset key new_value 获取旧值时使用新值替换旧值,如果key不存在,则返回nil,并设置key的值为new_value getrange key offset_begin offset_end 获取一个key的指定返回字符串 getrange email 3 5 "ric" mget key1 kye2 kye3 ... 获取多个key值,不存在的key返回(nil) decr key 对key减一 key-- decrby key value 对key做 key -= value incr key 对key的值做加1操作,并返回新的值,如果key不存在则创建一个并赋值为0,因此incr后变成1 incrby key value 对key的值加value incrby k 5 (integer) 5 incrby k -3 (integer) 2 get k "2" append key value 对key追加value,返回追加后key值的总长度,如果key不存在则创建 append k .com (integer) 5 get k "2.com"
hashes类型及操作
Redis hash是一个String类型的field和value的映射表。它的添加、删除操作都是O(1)。hash特别适合用于存储对象。相较于将对象的每个字段存成单个String类型。将一个对象存储在hash类型中会占用更少的内存,并且可以方便的存取整个对象。lists类型及操作
hset hashtable_name field_key value 设置hash field为指定值,如果field_key不存在则先创建 hget hashtable_name field_key hsetnx hashtable_name field_key value 设置hash field为指定值,如果field_key不存在,则先创建。如果存在则返回0 hmset hashtable_name field_key1 value1 field_key2 value2 ... hmget hashtable_name field_key1 field_key2 hincrby hashtable_name field_key value 对hash表中的字段field_key 加上value hexists hashtable_name field_key 判断hash表中的字段field_key是否存在 存在返回1,否则返回0 hdel hashtable_name field_key 删除hash表中的字段field_key删除 hkeys hashtable_name 返回hashtable_name中的全部field_key hvals hashtable_name 返回hashtable_name中的value值 hgetall hashtable_name 同时返回所有的字段和内容
list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等,操作中key理解为链表的名字。Redis的list类型其实就是一个每个子元素都是String类型的双向链表。我们可以通过push、pop操作链表的头部或者尾部添加删除元素,这样list可以作为栈,又可以作为队列。 lpush list_name_key value 在list_name_key对应list头部添加字符串元素 可以同时插入多个 rpush list_name_key value 从尾部插入 可以同时插入多个 linsert list_name_key before/after value1 value2 在value1前/后插入value2 lrange list_name_key 0 -1 列取list_name_key对应的list的所有值,0代表头,-1代表尾 lset list_name_key i value 将下标为i(i从0开始)的内容替换成value
127.0.0.1:6379> lrange list_0 0 -11) "three"2) "two"3) "one" 127.0.0.1:6379> lset list_0 1 four OK 127.0.0.1:6379> lrange list_0 0 -1 1) "three" 2) "four" 3) "one"
lrem list_name_key count value 从链表中删除count个与value相同的值
127.0.0.1:6379> lrange list_0 0 -11) "one"2) "one"3) "one"4) "one"5) "three"6) "four"7) "one"127.0.0.1:6379> lrem list_0 3 "one"(integer) 3127.0.0.1:6379> lrange list_0 0 -11) "one"2) "three"3) "four"4) "one"127.0.0.1:6379> lrange list_0 0 -11) "three"2) "four"3) "one"
ltrim list_name_key begin end 保留从begin到end之间的数值,其他的全部删除
127.0.0.1:6379> lrange list_0 0 -11) "one"2) "one"3) "one"4) "three"5) "four"6) "one"127.0.0.1:6379> ltrim list_0 4 5OK127.0.0.1:6379> lrange list_0 0 -11) "four"2) "one"
lpop list_name_key 从头部弹出一个元素
127.0.0.1:6379> lrange list_0 0 -11) "four"2) "one"127.0.0.1:6379> lpop list_0"four"127.0.0.1:6379> lrange list_0 0 -11) "one"
rpop list_name_key 从尾部弹出一个元素 rpoplpush list_name_key1 list_name_ley2 从第一个list的尾部移除一个元素并添加到第二个list的头部 lindex list_name_key index 返回名称为list_name_key的list中index位置的元素
127.0.0.1:6379> lrange list_0 0 -11) "ten"2) "three"3) "two"127.0.0.1:6379> lindex list_0 2"two"
llen list_name_key 返回对应list中的长度
sets类型及操作 set是集合,它是string类型的无序集合。set是通过hash table实现的添加、删除、和查找的复杂度都是O(1)。对集合我们可以取并集、交集、差集。通过这些操作我们可以实现sns中的好友推荐和blog的tag功能。
sadd set_name value 向set_name集合中添加value,集合中不允许有相同的value,插入相同的值时会返回0,表示失败 srem set_name value 将set_name集合中的value删除,删除成功返回1,失败返回0,如果不存在也返回0 spop set_name 在set_name集合中随机弹出一个元素并删除该元素 smembers set_name 列取set_name集合中的所有元素 sdiff set_name_1 set_name_2 计算两个集合的差集
127.0.0.1:6379> smembers s11) "a"2) "c"3) "b"127.0.0.1:6379> smembers s21) "d"2) "c"127.0.0.1:6379> sdiff s1 s21) "a"2) "b"127.0.0.1:6379> sdiff s2 s11) "d"
sdiffstore set_name_1 set_name_2 set_name_3 取set_name_2和set_name_3差集并将结果存入set_name_1中, 如果set_name_1已经存在,其原始数据将会被删除
127.0.0.1:6379> sdiffstore s3 s1 s2(integer) 2127.0.0.1:6379> smembers s31) "a"2) "b"
sinter set_name_1 set_name_2 获取交集 sinterstore set_name_3 set_name_1 set_name_2 获取set_name_1和set_name_2的交集并存于set_name_3中 sunion set_name_1 set_name_2 获取并集 sunionstore set_name_3 set_name_1 set_name_2 获取set_name_1和set_name_2的并集存于set_name_3中 smove set_name_1 set_name_2 value 将set_name_1中的value元素移动到set_name_2中,注意,如果value在set_name_2中已存在,则不会被插入,但是set_name_1中的value将会被移除 scard set_name 返回set_name集合中的元素个数 sismember set_name value 判断value是否为set_name集合的元素,返回1代表是,0代表不是 srandmember set_name 随机返回set_name集合的一个元素,但不删除
sorted sets类型及操作 sorted set是set的一个升级版本,它在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解为有两列的mysql表,一列存储value,一列存储序列。操作中key理解为zset的名字。
zadd set_name sequence_number value 往顺序集合中添加value,并添加顺序号sequence_number,如果value在集合中已存在,则会添加失败,但是会更新原来value的顺序号为后来更新的顺序号 127.0.0.1:6379> zadd zs1 1 one
(integer) 1127.0.0.1:6379> zadd zs1 2 two(integer) 1127.0.0.1:6379> zadd zs1 3 two(integer) 0127.0.0.1:6379> zadd zs1 4 four127.0.0.1:6379> zrange zs1 0 -1 withscores1) "one"2) "1"3) "two"4) "3"5) "four"6) "4"
zrange set_name begin end 获取有序集合中下标begin~end范围内的元素,如果end==-1则代表到集合末尾 zrange set_name begin end withscores 将sequence_number一起返回
127.0.0.1:6379> zrange zs1 0 -11) "one"2) "two"3) "four"127.0.0.1:6379> zrange zs1 0 -1 withscores1) "one"2) "1"3) "two"4) "3"5) "four"6) "4"
zrem set_name value 删除集合中元素值为value的元素,成功返回1,失败返回0 zincrby set_name n value 将集合中value所对应的序列号增加n
127.0.0.1:6379> zrange zs1 0 -1 withscores1) "two"2) "3"3) "four"4) "4"127.0.0.1:6379> zincrby zs1 2 two"5"127.0.0.1:6379> zrange zs1 0 -1 withscores1) "four"2) "4"3) "two"4) "5"zrank set_name value 返回集合set_name中按member元素的排名后(按score从小到大排序)value元素的下标(下标从1开始)
127.0.0.1:6379> zrange zs1 0 -1 withscores1) "one"2) "1"3) "four"4) "4"5) "two"6) "5"127.0.0.1:6379> zrank zs1 two(integer) 2zrevrange set_name begin end withscores 按降序排序列取begin~end间的元素
127.0.0.1:6379> zrevrange zs1 0 -1 withscores1) "two"2) "5"3) "four"4) "4"5) "one"6) "1"
zrangebyscore set_name begin end withscores 返回顺序号从begin到end的元素返回
127.0.0.1:6379> zrange zs1 0 -1 withscores1) "one"2) "1"3) "three"4) "2"5) "five"6) "3"7) "four"8) "4"9) "two"10) "5"127.0.0.1:6379> zrangebyscore zs1 2 4 withscores1) "three"2) "2"3) "five"4) "3"5) "four"6) "4"
zcount set_name begin end 返回集合中顺序号begin~end元素的个数
127.0.0.1:6379> zcount zs1 2 4(integer) 3zcard set_name 返回集合中的所有元素个数
127.0.0.1:6379> zcard zs1(integer) 5
zremrangebyrank set_name begin end 将索引(从0开始)区间为begin~end的元素删除
127.0.0.1:6379> zrange zs1 0 -1 withscores1) "one"2) "1"3) "three"4) "2"5) "five"6) "3"7) "four"8) "4"9) "two"10) "5"127.0.0.1:6379> zremrangebyrank zs1 1 3(integer) 3127.0.0.1:6379> zrange zs1 0 -1 withscores1) "one"2) "1"3) "two"4) "5"zremrangebyscore set_name begin end 按顺序号从begin~end的元素删除
127.0.0.1:6379> zrange zs1 0 -1 withscores1) "one"2) "1"3) "two"4) "5"127.0.0.1:6379> zremrangebyscore zs1 1 3(integer) 1127.0.0.1:6379> zrange zs1 0 -1 withscores1) "two"2) "5"
Redis常用命令 Redis提供了丰富的命令对数据库和各种数据类型进行操作,这些命令可以在Linux终端使用 1. 键值相关命令 2. 服务器相关命令
keys * 表示取出所有的key,类似模糊匹配,可在前或者在后添加多个字符 exists key 用于判断对应的key是否存在,存在返回1,否则返回0 del key 删除key,如果key不存在则返回0表示失败 同时可以删除多个 expire key seconds 对已存在的key设置过期时间为seconds秒 ttl key 获取key还剩多长时间过期,如果返回-2则表示已过期 move key database_number 将key从当前数据库移动到database_number数据库中 persist key 移除key的过期时间,让其不过期,此时使用ttl命令查看则返回-1,表示取消了过期时间 randomkey key 随机返回一个当前数据库中的一个key rename key new_key 重命名key为new_key type key 返回key所属的数据类型2.服务器相关命令
ping 检查当前连接是否正常,正常返回PONG echo test 输出test与linux shell的echo一样 select n Redis数据库编号从0~15,我们可以任意选择一个数据库进行数据存取 quit 退出当前连接 dbsize 返回当前数据库中key的总数目 info 获取Redis服务器的相关信息 config get 实时转储收到的请求 config get * 获取所有 flushdb 删除当前数据库中的所有库 flushall 删除所有数据库中的所有key(谨慎使用)
Redis高级实用特性 1. 安全性
设置客户端连接后进行任何其他操作前需要实用的密码
警告:因为redis速度相当快,所以在一台比较好的服务器下,一个外部的用户可以在一秒钟进行150k次的密码尝试,这意味着你需要指定非常非常强大的密码来防止暴力破解。
修改配置文件redis.conf
requirepass cynric #cynric即为密码,可以使用redis-cli -a cynric指定密码登陆,也可以登陆后通过auth cynric来授权2. 主从复制
Redis主从复制配置和使用都非常简单。通过主从复制可以允许多个slave server拥有和master server相同的数据库副本。其特点有:(1)master可以拥有多个slave (2)多个slave可以连接同一个master,还可以连接到其它slave (3)主从复制不会阻塞master,在同步数据时,master可以继续处理client请求。(4)提高系统的伸缩性3. 事务处理
配置主从服务器,修改配置文件slaveof ip port 如果主机配置了密码则需要配置masterauth passwd 查看当前Redis主机是master还是slave可以通过info命令查看
Redis对事务的支持目前还比较简单。Redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client命令。当一个client在一个连接中发出multi命令时,这个连接会进入一个事务上下文,该连接后续的命令不会立即执行,而是先放到一个队列中,当执行exec命令时,Redis会顺序的执行队列中的所有命令。在还没有执行exec之前可以通过discard命令取消还未执行的事务。如果事务中的某个命令执行出错,则事务不会回滚,已经正确执行的命令不会回滚。 multi 可用于打开事务上下文4. 乐观锁复杂事务控制
大多数是基于数据版本(version)的记录机制实现的。即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是为数据库表添加一个"version"字段来实现读取出数据时,将此版本号一同读出,之后更新时,对此版本号加1。此时,将提交的版本号与数据库表对应记录的当前版本号进行对比,如果提交的数据版本号大于数据库当前版本号,则予以更新,否则认为是过期数据。 watch命令会监视给定的key,当exec时,如果监视的key从调用watch后发生过变化,则整个事务会失败。也可以调用watch多次监视多个key。这样就可以对指定的key加乐观锁了。注意watch的key是对整个连接有效的,事务也一样。如果连接断开,监视和事务都会被自动清除。exec,discard,unwatch命令都会清除连接中的所有监视。 watch key 用于监视key的变化5.持久化机制 Redis是一个支持持久化的内存数据库,就是说Redis需要经常将内存中的数据同步到硬盘来保证持久化。
Redis支持两种持久方式: 1. Snapshotting方式即快照方式 该方式是默认的持久化方式。这种方式是将内存中数据以快照的方式写入二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照。 save 900 1 #900秒内如果超过1个key被修改,则发起快照保存 save 300 10 #300秒内如果超过10个key被修改,则发起快照保存
2. aof方式(Append-Only File) 由于快照方式是在一定间隔时间做一次的,所以如果Redis意外down掉的话,就会丢失最后一次快照的所有修改。aof比快照方式有更好的持久化性,是由于在使用aof时,Redis会将每一个收到的写命令都通过write函数追加到文件中,当Redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。当然由于操作系统会在内核中缓存write做的修改,所以可能不是立即写到磁盘上,这样aof方式的持久化也还是有可能丢失部分数据。可以通过配置文件告诉Redis通过fsync函数强制写入到磁盘的时机。 appendonly yes #启用aof持久化方式,默认为no appendfsync always #收到写命令就立即写入磁盘,最慢,但保证完全的持久化 appendfsync everysec #每一秒钟写入磁盘一次,在性能和持久化方面做了很好的折中,此为默认方式 appendfsync no #完全依赖操作系统的自动写入磁盘机制,性能最好,持久化没保证
6. 发布及订阅消息 发布订阅(pub/sub)是一种消息通信模式,主要的目的是解除消息发布者和消息订阅者之间的耦合,Redis作为一个pub/sub server,在订阅者和发布者之间起到了消息路由的功能。订阅者可以通过subcribe和psubscribe命令向Redis server订阅自己感兴趣的消息类型,Redis将信息类型成为通道(channel)。当发布者通过publish命令向Redis server发送特定类型的信息时,订阅该类型信息的全部client都会收到此消息。
subscribe channel_name ... 订阅channel_name频道"..."代表可是同时订阅到过频道 publish channel_name ... message 向channel_name频道中发布message消息
127.0.0.1:6379> publish tv1 "test message" (integer) 2
127.0.0.1:6379> subscribe tv1 tv2 Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "tv1" 3) (integer) 1 1) "subscribe" 2) "tv2" 3) (integer) 2 1) "message" 2) "tv1" 3) "test message"
注:先得subscribe订阅频道,publish才会成功
7. 虚拟内存的使用(Redis 3.0中虚拟内存配置取消了) Redis的虚拟内存与操作系统的虚拟内存不是一回事,但是其思路和目的都是相同的。就是暂时把不经常访问的数据从内存交换到磁盘中,从而腾出内存用于其他需要访问的数据。尤其是对Redis这样的内存数据库,内存总是不够用的。除了可以将数据分割到多个Redis server外。另外能够提高数据库容量的办法就是使用虚拟内存把那些不经常访问的数据交换到磁盘上。相关配置如下:
vm-enabled yes #开启vm功能,默认为no vm-swap-file /tmp/redis.swap #交换出来的value保存的文件路径 vm-max-memory 1000000 #Redis使用的最大内存上限 vm-page-size 32 #每个页面的大小32字节 vm-page 134217728 #最多使用多少页面 vm-max-threads 4 #用于执行value对象换入的工作线程数量
《有道云笔记》是有道搜索推出的笔记类应用,通过云存储技术帮助用户建立一个可以轻松访问、安全存储的云笔记空间,解决个人资料和信息跨平台跨地点的管理问题。
《轻笔记》是一款为中国用户量身订做的云记事本应用,深度开发ios系统功能,优化界面操作流程,更加符合国人记录习惯文字、语音、照片等多种录入模式,帮您完美记录想到的。
《豆瓣笔记》让你可以随时写读书笔记以及阅读他人的读书笔记。基于豆瓣读书现有的庞大图书资料库,你可以通过扫描条形码迅速找到手边读物,开始写笔记。零碎的笔记会按照图书组织,在你的书单上展示得井井有条,方便查阅。
《为知笔记》是一款提供在线云存储服务的笔记软件。利用为知笔记, 您可以随时随地记录您思想的火花、生活的点滴和工作上的事情, 从而释放您的大脑。再配合为知笔记的其他客户端, 比如PC端软件, web端,手机网页端, android客户端,您能够随时随地阅读您的笔记。
你可以去ios.d.cn上面直接搜索“笔记”,根据软件介绍来选择你想要的O(∩_∩)O~

叶(Yè叶)姓源出有四: 1、出自芈姓,颛顼后裔叶公之后,以封邑为氏。据《风俗通义》及《通志·氏族略·以邑为氏》等资料所载,颛顼后人沈诸梁,又称叶公,叶公即成语“叶公好龙”中的叶公,原名沈诸梁,字子高,系春秋时期楚国左司马沈尹戌之子,才能出众,楚惠王时期被任命为楚国北边要邑叶邑的行政长官,因楚县尹通称为“公”,故称“叶公”。叶公在叶邑兴修水利,使当地的生存环境有了较大的改善,邑人“莫不欣戴”。他平定白公之乱,身兼要职而不恋权位,激流勇退并归隐终老于叶邑。其后裔以邑为氏,叶邑成为叶氏祖地,叶公成为叶氏始祖。 2、出自叶调国。 叶调为古国名,故地在今天印度尼西亚爪哇岛或者苏门答腊岛,东汉永建六年曾经遣使中国,建立友好关系,叶调国来中国的移民多以叶为姓,传名竹帛。 3、出自中国古姓。中国古姓中的“叶阳氏”、“叶大夫氏”今天已经见不到。按照两字姓、三字姓转为单字姓的规律,叶阳氏、叶大夫氏后来也改为叶氏。 4、出自其他源流和少数民族有叶姓: ①据《姓氏考略》所载,我国古代南方少数民族日南郡(今越南境内)蛮有以叶为姓者。如春秋时吴国人叶雄即是南方少数民族的后裔。 ②满族纳喇氏、叶赫勒氏、德昂族亥氏,台湾土著、彝、蒙、土家、锡伯、保安、回、苗等民族均有叶姓。 得姓始祖:叶子高。上古时代,颛顼的后裔陆终有六子,其中幼子名季连。季连的后裔曾做过周文王的老师,被周成王追封在荆山(今湖北省西部)一带,立国为荆,定都丹阳,后迁都于郢,改国号为楚。春秋时,楚庄王曾孙戌,在楚平王时任沈县(今安徽省临泉县)尹,其后人便以沈为氏。戌后任楚国左司马,他为人正直,疾恶如仇,深得楚人的敬重。楚昭王十八年(公元前498年),在与吴军打仗时英勇战死,楚昭王遂封他的儿子沈诸梁在叶为尹。沈诸梁承其父志曾平定白公胜的叛乱以复惠王,为楚国立下大功,被封到南阳,赐爵为公,世人尊为叶公。于是其后人便以邑为氏,沈诸梁则被尊为叶姓始祖,因其字号子高,后人也习惯称其为叶子高。◆叶姓典故 中国古代寓言“叶公好龙”的故事家喻户晓,喜假龙而惧真龙的叶公,成了口是心非、虚伪者的象征。殊不知,历史上的叶公不仅是叶姓的始祖,还是春秋楚国的一位著名政治家、军事家。 “因为历史原因,许多人心目中的叶公形象与历史上的叶公真人不符,我们有责任还其‘庐山真面目’,”郑州大学教授安国楼说。日前,中国首次发行了成语故事《叶公好龙》特种邮票。 安国楼教授说:“这则传说经刘向《新序》记载后,广为流传,而世间所谓的‘龙’压根儿就不存在,何以言真假。” 据当地官员介绍,由于“叶公好龙”这则成语的缘故,海内外许多叶氏后裔无法自豪地介绍自己的始祖,许多叶县籍人氏无法自豪地介绍自己与“叶公”同乡。为此,“叶公与叶姓文化学术研讨会”曾专门在河南省叶县对此进行研讨,50多位专家引经据典,为叶公“平反昭雪”。专家考证,叶公沈诸梁,字子高,被楚昭王封为叶邑尹而始姓叶。叶公生于楚国王室之家,曾祖父是春秋五霸之一的楚庄王,其父沈尹戍在吴楚之战中屡立战功。秦国出兵击退吴军后,楚昭王把沈诸梁封到楚国北疆重镇“方城之外”的叶邑为尹。 经考古发掘证实,叶公采取养兵息民、发展农业、增强国力的策略,组织民众修筑了中国现存最早的水利工程,使当地数十万亩农田得以灌溉,比李冰修都江堰早200多年。至今,叶公修筑的东陂、西陂遗址保存尚好,见证了叶公治水的历史。 根据《周礼》规制,叶公去世后,即被立祠享祭。叶公的后裔为纪念祖上之德与祖居之地,部分改沈为叶,是为叶姓之源。因此,叶公沈诸梁又是世界叶姓华人公认的始祖。自战国以后逐渐由中原地区向南方及海外播迁,子孙遍及世界五大洲。◆......余下全文>>