Redis基础笔记
事务
SORT
生存时间
任务队列
发布/订阅模式
Python中使用Redis
实际实例
管理
其他
1. 字符串类型
2. 散列类型
3. 列表类型
4. 集合类型
5. 有序集合
简介
安装
资源链接
简介
五种数据类型及相应命令
其他
推荐书籍:《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.缓存系统: 可以为每个键设置TTL(Time To Live),生存时间到期后键会自动被删除 可限定数据占用最大内存空间,数据大道空间限制后自动按照一定规则淘汰不需要键 2.任务队列: redis列表类型可以用来实现队列, 支持阻塞式读取,很容易用作高性能队列,还支持“发布/订阅“消息的模式
其他:
1.Redis中, 所有数据都存储在内存中, 但提供了持久化支持, 内存中数据可以异步写入硬盘, 不影响现有服务 2.与memcached对比, redis单线程模型, memcached支持多线程. 但redis支持高级数据类型和持久化
安装
1.wget http://download.redis.io/releases/redis-2.6.16.tar.gz 2.tar -xzvf redis-2.6.16.tar.gz 3.cd redis-2.6.16 4.make 5.make install
osx
brew install redis
安装后,在/usr/local/bin下面有
redis-server 服务器, 重点 redis-cli 命令行客户端, 重点 redis-benchmark 性能测试工具 redis-check-aof AOF文件修复工具 redis-check-dump RDB文件检查工具
启动
直接启动
redis-server #默认6379 redis-server --port 6380 # 启动命令中配置将覆盖配置文件中同名参数 redis-server /path/to/redis.conf --loglevel warning
通过初始化脚本运行(生产环境)
在安装包目录redis-2.6.16/utils/redis_init_script 1.将脚本复制到/etc/init.d目录下,文件名为 redis_端口号, 修改文件第六行 REDISPORT为相同端口号 2.建立目录 /etc/redis 存放配置文件 /var/redis/端口号 存放持久化文件 3.修改配置文件 将配置文件redis-2.6.16/redis.conf 复制到/etc/redis目录下,以端口号命名 e.g. 6379.conf 修改配置文件中部分参数 daemonize yes 使redis以守护进程模式运行 pidfile /var/run/redis_端口号.pid 设置redis的PID文件按位置 port 端口号 设置监听的端口号 dir /var/redis/端口号 设置持久化文件存放位置
停止
redis-cli SHUTDOWN //server断开所有客户端连接, 根据配置执行持久化, 最后退出
Redis命令行客户端
发送命令: redis-cli -h 127.0.0.1 -p 6379 redis-cli PING redis-cli 命令返回值 状态回复,e.g. >PING 错误恢复, e.g. >ECMD 整数回复, e.g. >INCR foo 字符串回复,e.g. >GET foo >GET notexists` 多行字符串回复,e.g. >KEYS *
基础命令(redis-cli)
返回符合规则的键名列表
pattern支持通配符, ? * [] 等, 会遍历所有键, 当键的数量较多时影响性能
>KEYS pattern
e.g.
>SET bar 1 >KEYS *
判断一个键是否存在
返回,0不存在,1存在
>EXISTS key
e.g.
127.0.0.1:6379> EXISTS bar (integer) 1 127.0.0.1:6379> EXISTS foo (integer) 0
删除键
可以删除多个键, 返回删除的个数
>DEL key [key ...]
e.g.
127.0.0.1:6379> DEL bar (integer) 1 127.0.0.1:6379> DEL bar (integer) 0
获取键值的数据类型
返回string,hash(散列),list(列表),set(集合),zset(有序集合)
>TYPE key
e.g.
127.0.0.1:6379> SET bar 1 OK 127.0.0.1:6379> TYPE bar string
最基本类型, 能存储任何形式/编码字符串, 包括二进制. 允许存储最大容量是512M
赋值和取值命令
>SET key value >GET key
e.g.
127.0.0.1:6379> SET hi "hello world" OK 127.0.0.1:6379> GET hi "hello world" 127.0.0.1:6379> GET abc (nil)
递增数字(当存储的字符串是整数形式时)
当操作键不存在时,默认值0,第一次递增后结果1,当键值不是整数时,报错 >INCR key 原子操作,可用于类似访问量统计, 自增id >INCRBY key increment >INCRBY bar 2
e.g.
127.0.0.1:6379> INCR abc (integer) 1 127.0.0.1:6379> GET abc "1" 127.0.0.1:6379> INCRBY abc 2 (integer) 3 127.0.0.1:6379> GET abc "3"
减少数字
>DECR key >DECRBY key decrement
e.g.
127.0.0.1:6379> DECR abc (integer) 2 127.0.0.1:6379> DECRBY abc 2 (integer) 0
浮点数
>INCRBYFLOAT key increment >INCRBYFLOAT bar 2.7
e.g.
127.0.0.1:6379> GET bar "1" 127.0.0.1:6379> INCRBYFLOAT bar 1.5 "2.5"
向尾部追加
返回追加字符串长度 >APPEND key value
e.g.
>SET key hello >APPEND key "world"
获取字符串长度
>STRLEN key
e.g.
127.0.0.1:6379> GET hi "hello world" 127.0.0.1:6379> STRLEN hi (integer) 11
同时设置,获取多个键值
>MGET key [key ...] >MSET key value [key value ...]
e.g.
127.0.0.1:6379> MSET k1 v1 k2 v2 OK 127.0.0.1:6379> GET k1 "v1" 127.0.0.1:6379> MGET k1 k2 1) "v1" 2) "v2"
位操作
>GETBIT key offset >SETBIT key offset value >BITCOUNT key [start] [end] #获取值为1的二进制位个数 >BITOP operation destkey key [key ...] #对多个字符串类型键进行位运算, 并将结果存储到destkey e.g. BITOP OR res fol fo2 GET res
e.g.
a 97 01100001 127.0.0.1:6379> SET k 'a' OK 127.0.0.1:6379> GET k "a" 127.0.0.1:6379> GETBIT k 0 (integer) 0 127.0.0.1:6379> GETBIT k 1 (integer) 1 127.0.0.1:6379> BITCOUNT k (integer) 3
BP: redis对键的命名, 对象类型:对象id:对象属性
一种字典结构,其存储了字段(field)和字段值映射,但字段值只能是字符串,不支持其他数据类型(即散列类型不支持数据类型嵌套)
散列类型适合存储对象
对象类型:id - 对象属性 - 对象属性值
基本命令
>HSET key field value >HGET key field #HSET不区分插入更新 >HMSET key field value [field value ...] >HMGET key field [field ...] >HGETALL key
e.g.
127.0.0.1:6379> HSET car name bmw (integer) 1 127.0.0.1:6379> HGET car name "bmw" 127.0.0.1:6379> HMSET car price 100 score 50 OK 127.0.0.1:6379> HMGET car name price score 1) "bmw" 2) "100" 3) "50" 127.0.0.1:6379> HGETALL car 1) "name" 2) "bmw" 3) "price" 4) "100" 5) "score" 6) "50"
判断字段是否存在
#存在返回1,否则返回0 >HEXISTS key field
e.g.
127.0.0.1:6379> HEXISTS car name (integer) 1 127.0.0.1:6379> HEXISTS car model (integer) 0
当字段不存在时赋值
#已存在不进行任何操作, 不存在赋值 >HSETNX key field value
e.g.
127.0.0.1:6379> HSETNX car name abc (integer) 0 127.0.0.1:6379> HGET car name "bmw" 127.0.0.1:6379> HEXISTS car model (integer) 0 127.0.0.1:6379> HSETNX car model 1 (integer) 1 127.0.0.1:6379> HGET car model "1"
增加数字
>HINCRBY key field increment
e.g.
>HINCRBY person score 60
删除字段
>HDEL key field [field ...]
e.g.
HDEL car price
只获取字段名或字段值
>HKEYS key >HVALS key
e.g.
127.0.0.1:6379> HKEYS car 1) "name" 2) "price" 3) "score" 4) "model" 127.0.0.1:6379> HVALS car 1) "bmw" 2) "100" 3) "50" 4) "1"
获取字段数量
>HLEN key
e.g.
127.0.0.1:6379> HLEN car (integer) 4
List, 可以存储一个有序的字符串列表, 列表内元素非唯一性,可以向两端加入元素,或者获得列表的某一个片段
内部使用双向链表实现,两端添加元素复杂度O(1), 通过索引访问的速度较慢
可以用在分页, 新鲜事, 记录日志等
向列表两端增加元素(可同时增加多个)
>LPUSH key value [value ...] >RPUSH key value [value ...]
e.g.
127.0.0.1:6379> LPUSH num 1 2 3 (integer) 3 127.0.0.1:6379> RPUSH num 0 (integer) 4 # 3 2 1 0
从列表两端弹出元素
先移除一个元素,然后返回之
>LPOP key >RPOP key
e.g.
127.0.0.1:6379> LPOP num "3" 127.0.0.1:6379> RPOP num "0"
获取元素个数
>LLEN key
e.g.
127.0.0.1:6379> LLEN num (integer) 2
获取片段(同python切片,-1表最后一个, stop超出返回最右边元素, start大于stop返回空)
>LRANGE key start stop
e.g.
127.0.0.1:6379> LPUSH test a b c d e f g (integer) 7 127.0.0.1:6379> LRANGE test 0 2 1) "g" 2) "f" 3) "e"
删除列表中指定值的元素
>LREM key count value 删除列表中前count个值为value的元素,返回值为实际删除元素的个数 count = 0 所有 > 0 从左边开始删count个 < 0 从右边开始删|count|个
e.g.
127.0.0.1:6379> LRANGE test 0 2 1) "g" 2) "f" 3) "e" 127.0.0.1:6379> LREM test 0 f (integer) 1 127.0.0.1:6379> LRANGE test 0 2 1) "g" 2) "e" 3) "d"
设置指定索引元素值
>LINDEX key index >LSET key index value
e.g.
127.0.0.1:6379> LPUSH lt 3 2 1 (integer) 3 127.0.0.1:6379> LINDEX lt 0 "1" 127.0.0.1:6379> LSET lt 0 -1 OK 127.0.0.1:6379> LINDEX lt 0 "-1"
只保留列表指定片段
删除指定索引范围之外的所有元素 >LTRIM key start end
e.g.
127.0.0.1:6379> LRANGE la 0 99 1) "6" 2) "5" 3) "4" 4) "3" 5) "2" 6) "1" 127.0.0.1:6379> LTRIM la 0 2 OK 127.0.0.1:6379> LRANGE la 0 99 1) "6" 2) "5" 3) "4"
向列表中插入元素
>LINSERT key BEFORE|AFTER pivot value 从左到右查找值为pivot的元素,然后根据BEFORE/AFTER决定将value插入该元素前面还是后面
e.g.
127.0.0.1:6379> LRANGE la 0 99 1) "6" 2) "5" 3) "4" 127.0.0.1:6379> LINSERT la AFTER 5 3 (integer) 4 127.0.0.1:6379> LRANGE la 0 99 1) "6" 2) "5" 3) "3" 4) "4"
将元素从一个列表转到另一个列表
RPOPLPUSH source destination #RPOP,然后LPUSH,返回每个元素值,e.g.循环测试网址的可用性