点滴记录——学习Redis笔记
转载请说明出处:http://blog.csdn.net/cywosp/article/details/39701409
1. 取最新N个数据的操作2. 排行榜应用,取TOP N操作3. 须要精确设定过期时间的应用4. 计数器应用5. Uniq操作,获取某段时间全部数据排重值6. 实时系统,反垃圾系统7. Pub/Sub构建实时消息系统——消息的公布与订阅8. 构建队列系统9. 缓存
String是最简单的类型。一个Key相应一个Value,String类型是二进制安全的。Redis的String能够包括不论什么数据。比方jpg图片或者序列化的对象。
set key valueget keysetex key time_seconds value 设置key相应的值为String类型的value,并指定此键值的有效期setnx key value 假设key不存在才设置value,否则返回0setrange key offset replace_value 设置指定key的value值的子字符串,成功返回替换后的字符串总长度,假设原先的key不存在,则创建,返回offset+strlen(replace_value)。其具有替换功能set email cynric@apusapp.com
setrange email 7 sina //从email的第8(从1開始)个字符開始替换成sinaget emailcynric@sinaapp.com
get em(nil)setrange em 3 aaa(integer) 6get 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_valuegetrange 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 -= valueincr key 对key的值做加1操作。并返回新的值,假设key不存在则创建一个并赋值为0。因此incr后变成1incrby key value 对key的值加valueincrby k 5(integer) 5incrby k -3(integer) 2get k"2"append key value 对key追加value,返回追加后key值的总长度,假设key不存在则创建append k .com(integer) 5get k"2.com"
Redis hash是一个String类型的field和value的映射表。它的加入、删除操作都是O(1)。hash特别适合用于存储对象。相较于将对象的每一个字段存成单个String类型。将一个对象存储在hash类型中会占用更少的内存,而且能够方便的存取整个对象。
hset hashtable_name field_key value 设置hash field为指定值,假设field_key不存在则先创建hget hashtable_name field_keyhsetnx 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_key2hincrby hashtable_name field_key value 对hash表中的字段field_key 加上valuehexists hashtable_name field_key 推断hash表中的字段field_key是否存在 存在返回1。否则返回0hdel hashtable_name field_key 删除hash表中的字段field_key删除hkeys hashtable_name 返回hashtable_name中的所有field_keyhvals 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前/后插入value2lrange 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 fourOK127.0.0.1:6379> lrange list_0 0 -11) "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中的长度
sadd set_name value 向set_name集合中加入value。集合中不同意有同样的value,插入同样的值时会返回0,表示失败srem set_name value 将set_name集合中的value删除,删除成功返回1。失败返回0,假设不存在也返回0spop 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集合的一个元素。但不删除
能够理解为有两列的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。失败返回0zincrby 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) 2
zrevrange 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 withscores
1) "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) 3
zcard 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) 3
127.0.0.1:6379> zrange zs1 0 -1 withscores
1) "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) 1
127.0.0.1:6379> zrange zs1 0 -1 withscores
1) "two"
2) "5"
keys * 表示取出全部的key,类似模糊匹配。可在前或者在后加入多个字符exists key 用于推断相应的key是否存在,存在返回1。否则返回0del 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 随机返回一个当前数据库中的一个keyrename key new_key 重命名key为new_keytype key 返回key所属的数据类型
ping 检查当前连接是否正常。正常返回PONGecho test 输出test与linux shell的echo一样select n Redis数据库编号从0~15,我们能够随意选择一个数据库进行数据存取quit 退出当前连接dbsize 返回当前数据库中key的总数目info 获取Redisserver的相关信息config get 实时转储收到的请求config get * 获取全部flushdb 删除当前数据库中的全部库flushall 删除全部数据库中的全部key(慎重使用)
设置client连接后进行不论什么其它操作前须要有用的password
警告:由于redis速度相当快。所以在一台比較好的server下,一个外部的用户能够在一秒钟进行150k次的password尝试。这意味着你须要指定很很强大的password来防止暴力破解。
改动配置文件redis.conf
requirepass cynric #cynric即为password。能够使用redis-cli -a cynric指定password登陆。也能够登陆后通过auth cynric来授权
Redis主从复制配置和使用都很easy。通过主从复制能够同意多个slave server拥有和master server同样的数据库副本。其特点有:(1)master能够拥有多个slave (2)多个slave能够连接同一个master。还能够连接到其他slave (3)主从复制不会堵塞master,在同步数据时。master能够继续处理client请求。
(4)提高系统的伸缩性
配置主从server。改动配置文件slaveof ip port 假设主机配置了password则须要配置masterauth passwd查看当前Redis主机是master还是slave能够通过info命令查看
Redis对事务的支持眼下还比較简单。Redis仅仅能保证一个client发起的事务中的命令能够连续的运行,而中间不会插入其它client命令。当一个client在一个连接中发出multi命令时,这个连接会进入一个事务上下文,该连接兴许的命令不会马上运行,而是先放到一个队列中,当运行exec命令时,Redis会顺序的运行队列中的全部命令。在还没有运行exec之前能够通过discard命令取消还未运行的事务。假设事务中的某个命令运行出错。则事务不会回滚。已经正确运行的命令不会回滚。
multi 可用于打开事务上下文
大多数是基于数据版本号(version)的记录机制实现的。即为数据添加一个版本号标识,在基于数据库表的版本号解决方式中,通常是为数据库表加入一个"version"字段来实现读取出数据时。将此版本号号一同读出,之后更新时,对此版本号号加1。此时,将提交的版本号号与数据库表相应记录的当前版本号号进行对照,假设提交的数据版本号号大于数据库当前版本号号。则予以更新,否则觉得是过期数据。watch命令会监视给定的key,当exec时,假设监视的key从调用watch后发生过变化,则整个事务会失败。也能够调用watch多次监视多个key。这样就能够对指定的key加乐观锁了。注意watch的key是对整个连接有效的。事务也一样。假设连接断开,监视和事务都会被自己主动清除。
exec,discard,unwatch命令都会清除连接中的全部监视。
watch key 用于监视key的变化
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持久化方式,默觉得noappendfsync always #收到写命令就马上写入磁盘,最慢,但保证全然的持久化appendfsync everysec #每一秒钟写入磁盘一次,在性能和持久化方面做了非常好的折中,此为默认方式appendfsync no #全然依赖操作系统的自己主动写入磁盘机制,性能最好,持久化没保证
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 tv2Reading messages... (press Ctrl-C to quit)1) "subscribe"2) "tv1"3) (integer) 11) "subscribe"2) "tv2"3) (integer) 21) "message"2) "tv1"3) "test message"
注:先得subscribe订阅频道,publish才会成功
就是临时把不常常訪问的数据从内存交换到磁盘中,从而腾出内存用于其它须要訪问的数据。尤其是对Redis这种内存数据库,内存总是不够用的。
除了可以将数据切割到多个Redis server外。另外可以提高数据库容量的办法就是使用虚拟内存把那些不常常訪问的数据交换到磁盘上。相关配置例如以下:
vm-enabled yes #开启vm功能,默觉得novm-swap-file /tmp/redis.swap #交换出来的value保存的文件路径vm-max-memory 1000000 #Redis使用的最大内存上限vm-page-size 32 #每一个页面的大小32字节vm-page 134217728 #最多使用多少页面vm-max-threads 4 #用于运行value对象换入的工作线程数量
点滴记录——学习Redis笔记的更多相关文章
- 开始记录学习java的笔记
今天开始记录学习java的笔记,加油
- 每天成长一点---WEB前端学习入门笔记
WEB前端学习入门笔记 从今天开始,本人就要学习WEB前端了. 经过老师的建议,说到他每天都会记录下来新的知识点,每天都是在围绕着这些问题来度过,很有必要每天抽出半个小时来写一个知识总结,及时对一天工 ...
- Redis学习——Redis事务
Redis和传统的关系型数据库一样,因为具有持久化的功能,所以也有事务的功能! 有关事务相关的概念和介绍,这里就不做介绍. 在学习Redis的事务之前,首先抛出一个面试的问题. 面试官:请问Redis ...
- 学习ThinkPHP笔记
学习ThinkPHP笔记 TP的模块化设计 名称 描述 应用 基于同一个入口文件访问的项目我们称之为一个应用. 模块 一个应用下面可以包含多个模块,每个模块在应用目录下面都是一个独立的子目录. 控制器 ...
- 学习Redis从这里开始
本文主要内容 Redis与其他软件的相同之处和不同之处 Redis的用法 使用Python示例代码与Redis进行简单的互动 使用Redis解决实际问题 Redis是一个远程内存数据库,它不仅性能强劲 ...
- 强化学习读书笔记 - 05 - 蒙特卡洛方法(Monte Carlo Methods)
强化学习读书笔记 - 05 - 蒙特卡洛方法(Monte Carlo Methods) 学习笔记: Reinforcement Learning: An Introduction, Richard S ...
- Redis学习——Redis持久化之AOF备份方式保存数据
新技术的出现一定是在老技术的基础之上,并且完善了老技术的某一些不足的地方,新技术和老技术就如同JAVA中的继承关系.子类(新技术)比父类(老技术)更加的强大! 在前面介绍了Redis学习--Redis ...
- 深入学习Redis(1):Redis内存模型
前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分. 我们使用Redis时,会接触Redis的5种对象类型(字符串 ...
- 深入学习Redis(5):集群
前言 在前面的文章中,已经介绍了Redis的几种高可用技术:持久化.主从复制和哨兵,但这些方案仍有不足,其中最主要的问题是存储能力受单机限制,以及无法实现写操作的负载均衡. Redis集群解决了上述问 ...
随机推荐
- 【基础篇】DatePickerDialog日期控件的基本使用(一)
项目步骤: 1.首先在Main.xml布局文件中添加一个Button标签,用来点击显示日期控件,Main.xml内容如下: <RelativeLayout xmlns:android=" ...
- 51Nod 迷宫问题(最短路+权值)(模板)
你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可以得到这个分数.还有若干双向道路连结这些房间,你沿着这些道路从一个房间走到另外一个房间需要一些时间.游戏规定了 ...
- chattr---文件隐藏属性
- 【例题 8-11 UVA-10954】Add All
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 就是合并果子.. 每次都合并最小的就可以啦. 别忘了初始化 [代码] /* 1.Shoud it use long long ? 2 ...
- [Redux-Observable && Unit Testing] Use tests to verify updates to the Redux store (rxjs scheduler)
In certain situations, you care more about the final state of the redux store than you do about the ...
- Drupal 关于节点(nodes)的理解
在 Drupal 构建的站点中.全部的内容都是以节点形式存储的,一个节点能够是公布的不论什么一个内容,比方说一个单面(page).一个投票(Poll).一篇文章(article).论坛主题(forum ...
- gomail发送附件
采用github.com/go-gomail/gomail/ 的邮件功能,可以发送附件 以及html文档,下面是其给出的demo,测试通过. package main //cmd: go get go ...
- jquery ui 分页插件 传入后台的连个參数名
參数名: page .rows page=int(request.form.get('page',1).encode('u8')) rows1=int(request.form.get('rows', ...
- 4. Spring Boot 过滤器、监听器
转自:https://blog.csdn.net/catoop/article/details/50501688
- Java – Reading a Large File Efficiently--转
原文地址:http://www.baeldung.com/java-read-lines-large-file 1. Overview This tutorial will show how to r ...