资源链接

推荐书籍:《Redis入门指南》

资源列表:

redis命令速查command | CMD索引-中文 | CMD树-中文

redis源码github

下载地址redis.io

The Little Redis book 入口

redis资料概要 @江南白衣 gist

redis资料汇总专题 nosqlfan (这个站有很多文章)

redis的设计与实现 文档

redis2.6带注释源码 github

redis 各种语言clientsclients

python redis cli redis-py

网络文章汇总 入口

文章列表:

十五分钟介绍Redis数据结构 入口

redis的订阅与发布 入口

redis之七种武器 入口

使用Redis的五个注意事项 入口

redis源码分析系列文章 入口

Largest Redis Clusters Ever 入口 (使用场景)

成人网站YouPorn使用Redis之经验谈 入口

相关项目

Redis监控web工具 redmon

简介

简介

Redis(REmote DIctionary Server),远程字典服务器,以字典结构存储数据,允许通过TCP协议读取字典中内容. 高性能键值对数据库

作用:

  1. 1.缓存系统: 可以为每个键设置TTL(Time To Live),生存时间到期后键会自动被删除
  2. 可限定数据占用最大内存空间,数据大道空间限制后自动按照一定规则淘汰不需要键
  3. 2.任务队列: redis列表类型可以用来实现队列, 支持阻塞式读取,很容易用作高性能队列,还支持“发布/订阅“消息的模式

其他:

  1. 1.Redis中, 所有数据都存储在内存中, 但提供了持久化支持, 内存中数据可以异步写入硬盘, 不影响现有服务
  2. 2.memcached对比, redis单线程模型, memcached支持多线程. redis支持高级数据类型和持久化

安装

安装

  1. 1.wget http://download.redis.io/releases/redis-2.6.16.tar.gz
  2. 2.tar -xzvf redis-2.6.16.tar.gz
  3. 3.cd redis-2.6.16
  4. 4.make
  5. 5.make install

osx

  1. brew install redis

安装后,在/usr/local/bin下面有

  1. redis-server 服务器, 重点
  2. redis-cli 命令行客户端, 重点
  3.  
  4. redis-benchmark 性能测试工具
  5. redis-check-aof AOF文件修复工具
  6. redis-check-dump RDB文件检查工具

启动

直接启动

  1. redis-server #默认6379
  2. redis-server --port 6380
  3. # 启动命令中配置将覆盖配置文件中同名参数
  4. redis-server /path/to/redis.conf --loglevel warning

通过初始化脚本运行(生产环境)

  1. 在安装包目录redis-2.6.16/utils/redis_init_script
  2.  
  3. 1.将脚本复制到/etc/init.d目录下,文件名为 redis_端口号, 修改文件第六行 REDISPORT为相同端口号
  4. 2.建立目录
  5. /etc/redis 存放配置文件
  6. /var/redis/端口号 存放持久化文件
  7. 3.修改配置文件
  8. 将配置文件redis-2.6.16/redis.conf 复制到/etc/redis目录下,以端口号命名 e.g. 6379.conf
  9. 修改配置文件中部分参数
  10. daemonize yes 使redis以守护进程模式运行
  11. pidfile /var/run/redis_端口号.pid 设置redisPID文件按位置
  12. port 端口号 设置监听的端口号
  13. dir /var/redis/端口号 设置持久化文件存放位置

停止

  1. redis-cli SHUTDOWN
  2. //server断开所有客户端连接, 根据配置执行持久化, 最后退出

Redis命令行客户端

  1. 发送命令:
  2. redis-cli -h 127.0.0.1 -p 6379
  3. redis-cli PING
  4. redis-cli
  5. 命令返回值
  6. 状态回复,e.g. >PING
  7. 错误恢复, e.g. >ECMD
  8. 整数回复, e.g. >INCR foo
  9. 字符串回复,e.g. >GET foo >GET notexists`
  10. 多行字符串回复,e.g. >KEYS *

五种数据类型及相应命令

基础命令(redis-cli)

  • 返回符合规则的键名列表

pattern支持通配符, ? * [] 等, 会遍历所有键, 当键的数量较多时影响性能

  1. >KEYS pattern

e.g.

  1. >SET bar 1
  2. >KEYS *
  • 判断一个键是否存在

返回,0不存在,1存在

  1. >EXISTS key

e.g.

  1. 127.0.0.1:6379> EXISTS bar
  2. (integer) 1
  3. 127.0.0.1:6379> EXISTS foo
  4. (integer) 0
  • 删除键

可以删除多个键, 返回删除的个数

  1. >DEL key [key ...]

e.g.

  1. 127.0.0.1:6379> DEL bar
  2. (integer) 1
  3. 127.0.0.1:6379> DEL bar
  4. (integer) 0
  • 获取键值的数据类型

返回string,hash(散列),list(列表),set(集合),zset(有序集合)

  1. >TYPE key

e.g.

  1. 127.0.0.1:6379> SET bar 1
  2. OK
  3. 127.0.0.1:6379> TYPE bar
  4. string

1. 字符串类型

最基本类型, 能存储任何形式/编码字符串, 包括二进制. 允许存储最大容量是512M

  • 赋值和取值命令

    1. >SET key value
    2. >GET key

e.g.

  1. 127.0.0.1:6379> SET hi "hello world"
  2. OK
  3. 127.0.0.1:6379> GET hi
  4. "hello world"
  5. 127.0.0.1:6379> GET abc
  6. (nil)
  • 递增数字(当存储的字符串是整数形式时)

    1. 当操作键不存在时,默认值0,第一次递增后结果1,当键值不是整数时,报错
    2. >INCR key
    3. 原子操作,可用于类似访问量统计, 自增id
    4.  
    5. >INCRBY key increment
    6. >INCRBY bar 2

e.g.

  1. 127.0.0.1:6379> INCR abc
  2. (integer) 1
  3. 127.0.0.1:6379> GET abc
  4. "1"
  5. 127.0.0.1:6379> INCRBY abc 2
  6. (integer) 3
  7. 127.0.0.1:6379> GET abc
  8. "3"
  • 减少数字

    1. >DECR key
    2. >DECRBY key decrement

e.g.

  1. 127.0.0.1:6379> DECR abc
  2. (integer) 2
  3. 127.0.0.1:6379> DECRBY abc 2
  4. (integer) 0
  • 浮点数

    1. >INCRBYFLOAT key increment
    2. >INCRBYFLOAT bar 2.7

e.g.

  1. 127.0.0.1:6379> GET bar
  2. "1"
  3. 127.0.0.1:6379> INCRBYFLOAT bar 1.5
  4. "2.5"
  • 向尾部追加

    1. 返回追加字符串长度
    2.  
    3. >APPEND key value

e.g.

  1. >SET key hello
  2. >APPEND key "world"
  • 获取字符串长度

    1. >STRLEN key

e.g.

  1. 127.0.0.1:6379> GET hi
  2. "hello world"
  3. 127.0.0.1:6379> STRLEN hi
  4. (integer) 11
  • 同时设置,获取多个键值

    1. >MGET key [key ...]
    2. >MSET key value [key value ...]

e.g.

  1. 127.0.0.1:6379> MSET k1 v1 k2 v2
  2. OK
  3. 127.0.0.1:6379> GET k1
  4. "v1"
  5. 127.0.0.1:6379> MGET k1 k2
  6. 1) "v1"
  7. 2) "v2"
  • 位操作

    1. >GETBIT key offset
    2. >SETBIT key offset value
    3.  
    4. >BITCOUNT key [start] [end] #获取值为1的二进制位个数
    5.  
    6. >BITOP operation destkey key [key ...] #对多个字符串类型键进行位运算, 并将结果存储到destkey
    7. e.g. BITOP OR res fol fo2
    8. GET res

e.g.

  1. a 97 01100001
  2.  
  3. 127.0.0.1:6379> SET k 'a'
  4. OK
  5. 127.0.0.1:6379> GET k
  6. "a"
  7.  
  8. 127.0.0.1:6379> GETBIT k 0
  9. (integer) 0
  10. 127.0.0.1:6379> GETBIT k 1
  11. (integer) 1
  12.  
  13. 127.0.0.1:6379> BITCOUNT k
  14. (integer) 3

BP: redis对键的命名, 对象类型:对象id:对象属性

2. 散列类型

一种字典结构,其存储了字段(field)和字段值映射,但字段值只能是字符串,不支持其他数据类型(即散列类型不支持数据类型嵌套)

散列类型适合存储对象

  1. 对象类型:id - 对象属性 - 对象属性值
  • 基本命令

    1. >HSET key field value
    2. >HGET key field
    3. #HSET不区分插入更新
    4.  
    5. >HMSET key field value [field value ...]
    6. >HMGET key field [field ...]
    7.  
    8. >HGETALL key

e.g.

  1. 127.0.0.1:6379> HSET car name bmw
  2. (integer) 1
  3. 127.0.0.1:6379> HGET car name
  4. "bmw"
  5.  
  6. 127.0.0.1:6379> HMSET car price 100 score 50
  7. OK
  8. 127.0.0.1:6379> HMGET car name price score
  9. 1) "bmw"
  10. 2) "100"
  11. 3) "50"
  12.  
  13. 127.0.0.1:6379> HGETALL car
  14. 1) "name"
  15. 2) "bmw"
  16. 3) "price"
  17. 4) "100"
  18. 5) "score"
  19. 6) "50"
  • 判断字段是否存在

    1. #存在返回1,否则返回0
    2. >HEXISTS key field

e.g.

  1. 127.0.0.1:6379> HEXISTS car name
  2. (integer) 1
  3. 127.0.0.1:6379> HEXISTS car model
  4. (integer) 0
  • 当字段不存在时赋值

    1. #已存在不进行任何操作, 不存在赋值
    2. >HSETNX key field value

e.g.

  1. 127.0.0.1:6379> HSETNX car name abc
  2. (integer) 0
  3. 127.0.0.1:6379> HGET car name
  4. "bmw"
  5.  
  6. 127.0.0.1:6379> HEXISTS car model
  7. (integer) 0
  8. 127.0.0.1:6379> HSETNX car model 1
  9. (integer) 1
  10. 127.0.0.1:6379> HGET car model
  11. "1"
  • 增加数字

    1. >HINCRBY key field increment

e.g.

  1. >HINCRBY person score 60
  • 删除字段

    1. >HDEL key field [field ...]

e.g.

  1. HDEL car price
  • 只获取字段名或字段值

    1. >HKEYS key
    2. >HVALS key

e.g.

  1. 127.0.0.1:6379> HKEYS car
  2. 1) "name"
  3. 2) "price"
  4. 3) "score"
  5. 4) "model"
  6. 127.0.0.1:6379> HVALS car
  7. 1) "bmw"
  8. 2) "100"
  9. 3) "50"
  10. 4) "1"
  • 获取字段数量

    1. >HLEN key

e.g.

  1. 127.0.0.1:6379> HLEN car
  2. (integer) 4

3. 列表类型

List, 可以存储一个有序的字符串列表, 列表内元素非唯一性,可以向两端加入元素,或者获得列表的某一个片段

内部使用双向链表实现,两端添加元素复杂度O(1), 通过索引访问的速度较慢

可以用在分页, 新鲜事, 记录日志等

  • 向列表两端增加元素(可同时增加多个)

    1. >LPUSH key value [value ...]
    2. >RPUSH key value [value ...]

e.g.

  1. 127.0.0.1:6379> LPUSH num 1 2 3
  2. (integer) 3
  3. 127.0.0.1:6379> RPUSH num 0
  4. (integer) 4
  5. # 3 2 1 0
  • 从列表两端弹出元素

先移除一个元素,然后返回之

  1. >LPOP key
  2. >RPOP key

e.g.

  1. 127.0.0.1:6379> LPOP num
  2. "3"
  3. 127.0.0.1:6379> RPOP num
  4. "0"
  • 获取元素个数

    1. >LLEN key

e.g.

  1. 127.0.0.1:6379> LLEN num
  2. (integer) 2
  • 获取片段(同python切片,-1表最后一个, stop超出返回最右边元素, start大于stop返回空)

    1. >LRANGE key start stop

e.g.

  1. 127.0.0.1:6379> LPUSH test a b c d e f g
  2. (integer) 7
  3. 127.0.0.1:6379> LRANGE test 0 2
  4. 1) "g"
  5. 2) "f"
  6. 3) "e"
  • 删除列表中指定值的元素

    1. >LREM key count value
    2.  
    3. 删除列表中前count个值为value的元素,返回值为实际删除元素的个数
    4. count = 0 所有
    5. > 0 从左边开始删count
    6. < 0 从右边开始删|count|个

e.g.

  1. 127.0.0.1:6379> LRANGE test 0 2
  2. 1) "g"
  3. 2) "f"
  4. 3) "e"
  5. 127.0.0.1:6379> LREM test 0 f
  6. (integer) 1
  7. 127.0.0.1:6379> LRANGE test 0 2
  8. 1) "g"
  9. 2) "e"
  10. 3) "d"
  • 设置指定索引元素值

    1. >LINDEX key index
    2. >LSET key index value

e.g.

  1. 127.0.0.1:6379> LPUSH lt 3 2 1
  2. (integer) 3
  3. 127.0.0.1:6379> LINDEX lt 0
  4. "1"
  5.  
  6. 127.0.0.1:6379> LSET lt 0 -1
  7. OK
  8. 127.0.0.1:6379> LINDEX lt 0
  9. "-1"
  • 只保留列表指定片段

    1. 删除指定索引范围之外的所有元素
    2. >LTRIM key start end

e.g.

  1. 127.0.0.1:6379> LRANGE la 0 99
  2. 1) "6"
  3. 2) "5"
  4. 3) "4"
  5. 4) "3"
  6. 5) "2"
  7. 6) "1"
  8. 127.0.0.1:6379> LTRIM la 0 2
  9. OK
  10. 127.0.0.1:6379> LRANGE la 0 99
  11. 1) "6"
  12. 2) "5"
  13. 3) "4"
  • 向列表中插入元素

    1. >LINSERT key BEFORE|AFTER pivot value
    2. 从左到右查找值为pivot的元素,然后根据BEFORE/AFTER决定将value插入该元素前面还是后面

e.g.

  1. 127.0.0.1:6379> LRANGE la 0 99
  2. 1) "6"
  3. 2) "5"
  4. 3) "4"
  5. 127.0.0.1:6379> LINSERT la AFTER 5 3
  6. (integer) 4
  7. 127.0.0.1:6379> LRANGE la 0 99
  8. 1) "6"
  9. 2) "5"
  10. 3) "3"
  11. 4) "4"

将元素从一个列表转到另一个列表

  1. RPOPLPUSH source destination
  2. #RPOP,然后LPUSH,返回每个元素值,e.g.循环测试网址的可用性

4. 集合类型

无序,无重复(唯一),可以存储最多2^32 - 1 个字符串

  • 增加删除元素

返回操作成功的个数

  1. >SADD key member [member ...]
  2. >SREM key member [member ...]

e.g.

  1. 127.0.0.1:6379> SADD letters a
  2. (integer) 1
  3. 127.0.0.1:6379> SADD letters a b c
  4. (integer) 2
  • 获得集合中的所有元素

    1. >SMEMBERS key

e.g.

  1. 127.0.0.1:6379> SMEMBERS letters
  2. 1) "c"
  3. 2) "a"
  4. 3) "b"
  • 判断元素是否在集合中(复杂度O(1))

    1. >SISMEMBER key member

e.g.

  1. 127.0.0.1:6379> SISMEMBER letters a
  2. (integer) 1
  3. 127.0.0.1:6379> SISMEMBER letters d
  4. (integer) 0
  • 集合间运算

    1. # 差集
    2. >SDIFF key [key ...]
    3. # 交集
    4. >SINTER key [key ...]
    5. # 并集
    6. >SUNION key [key ...]
  • 进行集合运算并将结果存储

    1. >SDIFFSTORE destination_key key [key ...]
    2. >SINTERSTORE destination_key key [key ...]
    3. >SUNIONSTORE destination_key key [key ...]
  • 获得集合中元素个数

    1. >SCARD key

e.g.

  1. 127.0.0.1:6379> SCARD letters
  2. (integer) 3
  • 随机获取集合中元素

    1. >SRANDMEMBER key [count]
    2. count,正数,获取count个不重复的元素
    3. count, 负数,获取|count|个,可能重复

e.g.

  1. 127.0.0.1:6379> SRANDMEMBER letters
  2. "b"
  3. 127.0.0.1:6379> SRANDMEMBER letters 2
  4. 1) "a"
  5. 2) "c"
  6.  
  7. 127.0.0.1:6379> SRANDMEMBER letters -2
  8. 1) "b"
  9. 2) "b"
  • 弹出一个元素

    1. >SPOP key

e.g.

  1. 127.0.0.1:6379> SPOP letters
  2. "c"
  3. 127.0.0.1:6379> SCARD letters
  4. (integer) 2

5. 有序集合

sorted set,集合中每个元素都关联一个分数(不同元素分数可以相同),可以根据分数进行排序(最高/最低N个),进行有序相关的操作(分数可以相同)

有序集合使用散列表和跳跃表实现, 读取复杂度更低, 更耗费内存

按点击量排序,按时间排序等等,时间轴操作

  • 增加元素

    1. >ZADD key score member [score member]

e.g.

  1. 127.0.0.1:6379> ZADD scoreboard 89 tom 67 peter 100 david
  2. (integer) 3
  3. 127.0.0.1:6379> ZADD scoreboard 70 peter
  4. (integer) 0
  • 获取元素分数

    1. >ZSCORE key member

e.g.

  1. 127.0.0.1:6379> ZSCORE scoreboard peter
  2. "70"
  • 获取排名在某个范围内的元素列表

分数相同,按字典序排,中文的话,取决于编码方式

  1. #分数从小到大排,返回索引从 start-stop之间的所有元素,包含两端元素, WITHSCORES同时获得元素分数
  2. >ZRANGE key start stop [WITHSCORES]
  3. >ZREVRANGE key start stop [WITHSCORES]

e.g.

  1. 127.0.0.1:6379> ZRANGE scoreboard 0 2
  2. 1) "peter"
  3. 2) "tom"
  4. 3) "david"
  5. 127.0.0.1:6379> ZRANGE scoreboard 0 2 WITHSCORES
  6. 1) "peter"
  7. 2) "70"
  8. 3) "tom"
  9. 4) "89"
  10. 5) "david"
  11. 6) "100"
  12.  
  13. 127.0.0.1:6379> ZREVRANGE scoreboard 0 2 WITHSCORES
  14. 1) "david"
  15. 2) "100"
  16. 3) "tom"
  17. 4) "89"
  18. 5) "peter"
  19. 6) "70"
  • 获取指定分数范围的元素

    1. >ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

e.g.

  1. 127.0.0.1:6379> ZRANGEBYSCORE scoreboard 80 100 WITHSCORES
  2. 1) "tom"
  3. 2) "89"
  4. 3) "david"
  5. 4) "100"

希望不包含端点值

  1. >ZRANGEBYSCORE scoreboard 80 (100
  2. 正负无穷大 +inf -inf

e.g.

  1. 127.0.0.1:6379> ZRANGEBYSCORE scoreboard 80 (100 WITHSCORES
  2. 1) "tom"
  3. 2) "89"
  4.  
  5. 127.0.0.1:6379> ZRANGEBYSCORE scoreboard 80 +inf WITHSCORES
  6. 1) "tom"
  7. 2) "89"
  8. 3) "david"
  9. 4) "100"
  10.  
  11. 127.0.0.1:6379> ZRANGEBYSCORE scoreboard 80 +inf WITHSCORES LIMIT 0 1
  12. 1) "tom"
  13. 2) "89"
  • 增加某个元素分数

    1. >ZINCRBY key increment member

e.g.

  1. 127.0.0.1:6379> ZSCORE scoreboard tom
  2. "89"
  3. 127.0.0.1:6379> ZINCRBY scoreboard 2 tom
  4. "91"
  5. 127.0.0.1:6379> ZSCORE scoreboard tom
  6. "91"
  • 获得集合中元素数量

    1. >ZCARD key

e.g.

  1. 127.0.0.1:6379> ZCARD scoreboard
  2. (integer) 3
  • 获得指定分数范围内的元素个数

    1. >ZCOUNT key min max

e.g.

  1. 127.0.0.1:6379> ZCOUNT scoreboard 80 100
  2. (integer) 2
  • 删除一个或多个元素

    1. >ZREM key member [member ...]
  • 按照排名范围删除元素

    1. >ZREMRANGEBYRANK key start stop
  • 按照分数范围删除

    1. >ZREMRANGEBYSCORE key min max
  • 获得元素排名

    1. >ZRANK key member #从小到大
    2. >ZREVRANK key member #相反

e.g.

  1. 127.0.0.1:6379> ZRANK scoreboard tom
  2. (integer) 1
  • 计算有序集合的交集

    1. >ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
    2.  
    3. #返回值为destination中元素个数
    4. #AGGREGATE sum默认值,destination键中元素分数是每个参与计算的集合中该元素分数的和
    5. min取最小值
    6. max取最大值
    7. #WEIGHTS 设置每个集合的权重,每个集合在参与计算时分数会被乘以权重

其他

事务

Redis中事务是一组命令的集合, 一个事务中的命令要么都执行, 要么都不执行

  1. > MULTI
  2. > SADD k1 v1
  3. > SADD k2 v2
  4. > EXEC

注意, 不支持回滚功能

SORT

可以对列表/集合/有序集合进行排序

最强大最复杂, 用不好可能成为性能瓶颈 O(n + mlogm) n为排序个数, m为返回个数

  1. >SORT key #从小到大
  2. >SORT key DESC #从大到小

SORTBY

  1. 127.0.0.1:6379> LPUSH sortbylist 2 1 3
  2. (integer) 3
  3. 127.0.0.1:6379> SET itemscore:1 50
  4. OK
  5. 127.0.0.1:6379> SET itemscore:2 100
  6. OK
  7. 127.0.0.1:6379> SET itemscore:3 -10
  8. OK
  9. 127.0.0.1:6379> SORT sortbylist BY itemscore:* DESC
  10. 1) "2"
  11. 2) "1"
  12. 3) "3"

SORTBY GET

  1. 127.0.0.1:6379> SORT sortbylist BY itemscore:* DESC GET POST:*->title GET POST:*->time

SOTRBY GET STORE

  1. 127.0.0.1:6379> SORT sortbylist BY itemscore:* DESC GET POST:*->title GET POST:*->time STORE new_key

生存时间

TTL, time to live

时效数据,过一定时间删除这些数据

  1. #设置
  2. >EXPIRE key seconds
  3. 1表示设置成功, 0表键不存在或设置失败
  4.  
  5. #查询
  6. >TTL key
  7. 键不存在返回-1 or 没有设置生存时间
  8.  
  9. #去除时效
  10. >PERSIST key
  11.  
  12. #SET/GETSET为键赋值会同时清除键的生存时间

任务队列

一般队列

  1. 生产者 LPUSH
  2. 消费者 RPOP
  3.  
  4. BRPOP RPOP类似,但是当列表中没有元素时,BRPOP会一直阻塞住链接,直到有新元素加入

优先队列

  1. BLPOP key [key ...] timeout,同时检测多个键,如果所有键都没有元素则阻塞,如果其中有一个键有元素,则从该键中弹出元素
  2. 如果都有,则从左到右的顺序取第一个键中的一个元素
  3.  
  4. BLPOP queue:1 queue:2 queue:3 0

发布/订阅模式

进程间消息传递

订阅者:订阅者可以订阅一个或多个频道

  1. >SUBSCRIBE channel1

发布者:可以向指定的频道发送消息,所有订阅此频道的订阅者都会受到此消息

  1. >PUBLISH channel1 helloworld

Python中使用Redis

官方推荐redis-py

安装

  1. sudo pip install redis
  2. sudo easy_install redis

使用

  1. redis-py提供两个类RedisStrictRedis用于实现Redis的命令,
  2. StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令(比如,SET命令对应与StrictRedis.set方法)
  3. RedisStrictRedis的子类,用于向后兼容旧版本的redis-py
  4.  
  5. >>> import redis
  6. >>> r = redis.StrictRedis(host='localhost', port=6379, db=0)
  7. >>> r.set('foo', 'bar')
  8. True
  9. >>> r.get('foo')
  10. 'bar'

connection pool

  1. 管理对一个redis server的所有连接,避免每次建立、释放连接的开销。
  2. 默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池。
  3.  
  4. pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
  5. r = redis.Redis(connection_pool=pool)

pipeline机制

  1. 可以在一次请求中执行多个命令,这样避免了多次的往返时延
  2. 当一组命令中每条命令都不依赖于之前的执行结果, 可以使用
  3.  
  4. pipe = r.pipeline()
  5. pipe.set('one', 'first')
  6. pipe.set('two', 'second')
  7. pipe.execute()
  8.  
  9. pipeline中的操作是原子的,要改变这种方式,可以传入transaction=False
  10.  
  11. pipe = r.pipeline(transaction=False)

实际实例

什么应用,都用什么方式处理的

1.一般的缓存

用字符串类型足矣, e.g.注册时得用户名冲突,在线用户

  1. >SET key value
  2. >GET

一些缓存场景

  1. 存储会话缓存(Session Cache), 利用持久化, 保存一些信息, 例如购物车
  2. 全页缓存(FPC)

2.计数,访问量统计,自增id等

  1. >INCR key

3.存储对象实例

  1. 用散列
  2. >HSET key field value
  3. >HGET key field

4.存列表,队列相关

作为队列使用

文章分类列表,评论列表等

  1. 用列表
  2. >LPUSH key value
  3. >RPUSH key value
  4.  
  5. >LPOP key
  6. >RPOP key

5.集合相关的

标签云等

  1. >SADD key member
  2. >SREM key member

6.排序相关

排行榜

访问量排序,点击量等

  1. 用有序结合
  2. >ZADD key score member

7.访问频率控制

设置key的失效时间 用 INCR 访问时检查次数, 若超过阈值, 走限制逻辑

or 记录次数, 超过阈值, 检查与最早一个相差是不是1分钟, 是, 走限制逻辑, 不是, 现有时间加入列表, 同时删除最早元素

8.发布/订阅

会用到的

管理

重启后数据不丢失, 两种方式, 可单独使用或者结合使用

持久化:

RDB

  1. 快照,符合一定条件时,将内存中的所有数据进行快照并存储到硬盘上
  2. 快照的条件可以在配置文件中配置, 两个参数: 时间和改动的键的个数
  3. Redis默认采用的持久化方式
  4.  
  5. 过程
  6. 1. Redis使用fork函数复制一份当前进程(父进程)的副本(子进程) (存的是fork时刻的数据)
  7. 写时复制copy-on-write 开始时父子共享同一内存数据, 当父进程修改某片数据, 操作系统复制一份以保证子进程数据不受影响
  8. 2. 父进程继续接收命令, 子进程开始将内存中数据写入硬盘中临时文件
  9. 3. 写入结束后, 替换旧的RDB文件
  10.  
  11. 任意时刻rdb文件都是完整地, 可以用于备份
  12.  
  13. 可以手动发SAVE / BGSAVE redis执行快照(前者由主进程进行快照操作,阻塞其他请求, 后者fork子进程)

AOF

  1. 每次执行一条会修改Redis中数据的命令,Redis会将该命令写到硬盘中的AOF文件
  2. 开启, 设置 appendonly yes
  3. 默认文件名 appendonly.aof 可以通过appendfilename设置
  4.  
  5. 纯文本文件, 每当达到一定条件时可以进行重写
  6. auto-aof-rewrite-percentage 100 #超过上一次百分比
  7. auto-aof-rewrite-min-size 64mb #允许重写的最小aof文件大小
  8.  
  9. 默认30s, 执行的命令同步到aof
  10. 可以配置
  11. appendfsync everysec # 每秒一次

Redis可以配置主从数据库

redis-server --port 6380 --slaveof 127.0.0.1 6379

复制原理: 从数据库启动, 向主库发SYNC, 主库后台开始保存快照(RDB), 并将保存期间的命令缓存起来. 快照完成后, 将快照文件和缓存的命令发送给从库, 从库收到后载入快照文件并执行命令. 不支持断点续传

读写分离: 主库禁用持久化, 从库启用. 从库崩溃, 重启自动更新. 主库崩溃, 从库提升为主库再修复

常用查看命令

telnet连接

  1. >telnet 127.0.0.1 6379

设定最大可用内存

如果服务器内存有限, 大量使用缓存且生存时间设置过长会导致Redis占满内存. or 为了防止占用内存过大而将生存时间设太短导致命中率过低

可以限制redis使用的最大内存, 按照一定规则淘汰不需要的键

  1. 配置文件
  2. maxmemory 限制最大可用内存大小(单位字节)
  3. maxmemory-policy 超过限制时的删除策略,一直删除直到小于指定内存
  4.  
  5. volatile-lru 使用LRU算法删除一个键,只对设置了生存时间的
  6. allkeys-lru 使用LRU算法删除一个键
  7. volatile-random 随机,只对设置了生存时间的
  8. allkeys-random
  9. volatile-ttl 删除生存时间最近的
  10. noeviction 不删除键,返回错误

耗时命令日志

  1. > SLOWLOG GET

其他

批量删除

  1. #删除 /test/*开始的
  2. ./redis-cli -a password -n 0 keys "/test/*" | xargs ./redis-cli -a password -n 0 del

精简键名和键值, 最直观的减少内存占用的方式

http://www.wklken.me/posts/2013/10/19/redis-base.html

REDIS基础笔记的更多相关文章

  1. Memcached与Redis对比,Redis基础笔记回顾

    Memcached 1.为什么要把数据存入内存?快 2.Memcached和Redis的区别 (1)Memcached缓存.Redis数据库,Memcached不支持持久化到磁盘 (2)Redis提供 ...

  2. Redis学习笔记~目录

    回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...

  3. Redis学习笔记4-Redis配置详解

    在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server   xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...

  4. Redis学习笔记(三)Redis支持的5种数据类型的总结

    继续Redis学习笔记(二)来说说剩余的三种数据类型. 三.列表类型(List) 1.介绍 列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的一段片段.列表类型内部是 ...

  5. Redis学习笔记(二)Redis支持的5种数据类型的总结之String和Hash

    引言 在Redis学习笔记(一)中我们已经会安装并且简单使用Redis了,接下来我们一起来学习下Redis支持的5大数据类型. 简介 Redis是REmote DIctionary Server(远程 ...

  6. redis入门笔记

    redis入门笔记 参考redis实战手册 1. Redis在windows下安装 下载地址:https://github.com/MSOpenTech/redis/tags 安装Redis 1.1. ...

  7. Redis学习笔记4-Redis配置具体解释

    在Redis中直接启动redis-server服务时, 採用的是默认的配置文件.採用redis-server   xxx.conf 这种方式能够依照指定的配置文件来执行Redis服务. 依照本Redi ...

  8. 【redis】redis基础命令学习集合

    写在前面 Redis是一个高速的内存数据库,它的应用十分广泛,可以说是服务端必学必精的东西.然而,学以致用,无用则无为.学了的东西必须反复的去用,去实践,方能有真知.这篇文章记录了我在redis学习过 ...

  9. 【转】Redis 基础操作和命令

    笔记 Redis提供了六种基本的数据结构:String,Hash,List,Set,Sorted Set,HyperLogLog. Redis的特点:纯内存操作,单线程工作模型,非阻塞I/O多路复用. ...

随机推荐

  1. POJ2112 Optimal Milking---二分+Floyd+网络流

    题目链接: https://vjudge.net/problem/POJ-2112 题目大意: k个机器,每个机器最多服务m头牛. c头牛,每个牛需要1台机器来服务. 告诉你牛与机器每个之间的直接距离 ...

  2. Problem D: 双向冒泡排序

    Problem D: 双向冒泡排序 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 447  Solved: 197[Submit][Status][We ...

  3. 解决Postgresql服务启动又关闭的问题

    查看日志发现如下错误消息:%t LOG: could not receive data from client: An operation was attempted on something tha ...

  4. @TransactionConfiguration过时与替代写法

    在使用了Spring的项目中做单元测试时,以前的标准写法是这样的: 但是在高版本的Spring框架中(Spring4.2以后),@TransactionConfiguration已经标注为过时的注解, ...

  5. Oracle 分区表的索引、分区索引

    对于分区表,可以建立不分区索引.也就是说表分区,但是索引不分区.以下着重介绍分区表的分区索引. 索引与表一样,也可以分区.索引分为两类:locally partition index(局部分区索引). ...

  6. Express中间件简单的实现原理

    上一篇理解Express的使用之后, 再总结一篇Express中间件的简单实现原理. 我们知道Express中间件就是一个个的函数, 那么怎么让这些函数有序的执行呢? 那就需要我们调用 next 函数 ...

  7. C++ 容器与继承

    如果容器类型定义为基类类型,那么虽然可以把派生类装进容器中,但是不能通过容器访问派生类自己的public成员,派生类将会倍切掉,只保留派生类的基类部分: 如果把容器定义为派生类类型,那么不能把基类类型 ...

  8. AIDE

    安装 yum install aide 修改配置文件 vim /etc/aide.conf (指定对哪些文件进行检测) /test/chameleon R /bin/ps R+a /usr/bin/c ...

  9. JavaScriptDate(日期)

    如何使用Date()方法获取当日的日期. getFullYear(): 使用getFullYear()获取年份. getTime(): getTime()返回1970年1月1日至今的毫秒数. setF ...

  10. php扩展开发-变量

    我们在php中用到的变量,在底层的C语言代码里是一个结构体,由四个成员组成typedef struct _zval_struct { zvalue_value value; /* 变量的值,也是一个结 ...