点滴记录——学习Redis笔记

时间:2022-01-06 19:33:21

转载请说明出处:http://blog.csdn.net/cywosp/article/details/39701409

Redis 默认port6379


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类型中会占用更少的内存,而且能够方便的存取整个对象。

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 同一时候返回全部的字段和内容

  lists类型及操作
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 -1
1) "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 -1
1) "one"
2) "one"
3) "one"
4) "one"
5) "three"
6) "four"
7) "one"
127.0.0.1:6379> lrem list_0 3 "one"
(integer) 3
127.0.0.1:6379> lrange list_0 0 -1
1) "one"
2) "three"
3) "four"
4) "one"
127.0.0.1:6379> lrange list_0 0 -1
1) "three"
2) "four"
3) "one"
ltrim list_name_key begin end  保留从begin到end之间的数值,其它的所有删除
127.0.0.1:6379> lrange list_0 0 -1
1) "one"
2) "one"
3) "one"
4) "three"
5) "four"
6) "one"
127.0.0.1:6379> ltrim list_0 4 5
OK
127.0.0.1:6379> lrange list_0 0 -1
1) "four"
2) "one"
lpop list_name_key  从头部弹出一个元素
127.0.0.1:6379> lrange list_0 0 -1
1) "four"
2) "one"
127.0.0.1:6379> lpop list_0
"four"
127.0.0.1:6379> lrange list_0 0 -1
1) "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 -1
1) "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 s1
1) "a"
2) "c"
3) "b"
127.0.0.1:6379> smembers s2
1) "d"
2) "c"
127.0.0.1:6379> sdiff s1 s2
1) "a"
2) "b"
127.0.0.1:6379> sdiff s2 s1
1) "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) 2
127.0.0.1:6379> smembers s3
1) "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) 1
127.0.0.1:6379> zadd zs1 2 two
(integer) 1
127.0.0.1:6379> zadd zs1 3 two
(integer) 0
127.0.0.1:6379> zadd zs1 4 four
127.0.0.1:6379> zrange zs1 0 -1 withscores
1) "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 -1
1) "one"
2) "two"
3) "four"
127.0.0.1:6379> zrange zs1 0 -1 withscores
1) "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 withscores
1) "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 withscores
1) "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 withscores

1) "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 withscores

1) "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 withscores

1) "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 withscores

1) "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 withscores

1) "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"



Redis经常使用命令
  Redis提供了丰富的命令对数据库和各种数据类型进行操作,这些命令能够在Linux终端使用
    1. 键值相关命令
    2. server相关命令
  Redis默认有0~15共16个数据库,使用select命令来进入不同的数据库,默认进入0数据库。select 1表示进入1数据库
  1. 键值相关命令
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.server相关命令
ping  检查当前连接是否正常。正常返回PONG
echo test   输出test与linux shell的echo一样
select  n  Redis数据库编号从0~15,我们能够随意选择一个数据库进行数据存取
quit   退出当前连接
dbsize   返回当前数据库中key的总数目
info    获取Redisserver的相关信息
config get   实时转储收到的请求
    config get * 获取全部
flushdb   删除当前数据库中的全部库
flushall   删除全部数据库中的全部key(慎重使用)

Redis高级有用特性
  1. 安全性

设置client连接后进行不论什么其它操作前须要有用的password

警告:由于redis速度相当快。所以在一台比較好的server下,一个外部的用户能够在一秒钟进行150k次的password尝试。这意味着你须要指定很很强大的password来防止暴力破解。

改动配置文件redis.conf

requirepass cynric           #cynric即为password。能够使用redis-cli -a cynric指定password登陆。也能够登陆后通过auth cynric来授权

  2. 主从复制
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命令查看
  3. 事务处理
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对象换入的工作线程数量