Redis学习笔记(一)
Redis是一个开源的,远程内存数据库。提供了5种不同类型的数据结构(String, List, Set, Hash, ZSet有序集合)
Redis官网
Redis有三个主要使其区别于其他很多竞争对手的特点(摘抄)
- Redis是完全在内存中保存数据的数据库,使用磁盘只是为了持久性目的;
- Redis相比许多兼职数据存储系统有相对丰富的数据类型
- Redis可以将数据复制到任意数量的从服务器中
Redis优点(摘抄)
- 异常快速:Redis是非常快的,每秒可以执行大约110000设置操作,81000个/每秒的读取操作。
- 支持丰富的数据类型 : Redis支持最大多数开发人员已经知道如列表,集合,可排序集合,哈希等数据类型。这使得在应用中很容易解决的各种问题,因为我们知道哪些问题处理使用哪种数据类型更好解决。
- 操作都是原子的 : 所有 Redis 的操作都是原子,从而确保当两个客户同时访问 Redis 服务器得到的是更新后的值(最新值)。
- MultiUtility工具:Redis是一个多功能实用工具,可以在很多如:缓存,消息传递队列中使用(Redis原生支持发布/订阅),在应用程序中,如:Web应用程序会话,网站页面点击数等任何短暂的数据;
一、Redis安装
有了memcache安装的阴影,这边直接放弃了在Mac上的安装o(╯□╰)o
系统环境:Ubuntu 64bit
1.安装
derek@root:~$ sudo apt-get update
derek@root:~$ sudo apt-get install redis-server
好了~安装好了!
2.启动
命令:redis-server
derek@root:~$ redis-server
11979:C 12 Sep 21:45:13.894 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
11979:M 12 Sep 21:45:13.895 * Increased maximum number of open files to 10032 (it was originally set to 1024).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 3.0.3 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 11979
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
11979:M 12 Sep 21:45:13.900 # Server started, Redis version 3.0.3
11979:M 12 Sep 21:45:13.900 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
11979:M 12 Sep 21:45:13.900 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
11979:M 12 Sep 21:45:13.900 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
11979:M 12 Sep 21:45:13.901 * The server is now ready to accept connections on port 6379
3.查看redis是否运行
命令:redis-cli
这将打开一个Redis提示符
derek@root:~$ redis-cli
127.0.0.1:6379>
- 127.0.0.1 是本机地址
- 6379 是Redis服务器运行的端口。
现在输入命令:ping
127.0.0.1:6379> ping
PONG
说明Redis安装成功,并且正常运行。
二、Redis数据类型
Redis支持5种数据结构,如下:
结构类型 | 结构存储的值 | 结构的读写能力 |
---|---|---|
STRING | 可以是字符串、整数或者浮点数 | 对整个字符串或者字符串的其中一部分执行操作;对整数和浮点数执行自增(increment)或者自减(decrement)操作 |
LIST | 一个链表,链表上每个节点都包含了一个字符串 | 从链表的两端推入或者弹出元素;根据偏移量对链表进行修剪(trim);读取单个或多个元素;根据值查找或者移除元素 |
SET | 包含字符串的无序收集器(unordered collection),并且被包含的每个字符串都是独一无二、各不相同的 | 添加、获取、移除单个元素;检查一个元素是否存在于集合中;计算交集、并集、差集;从集合里面随机获取元素 |
HASH | 包含键值对的无序散列表 | 添加、获取、移除单个键值对;获取所有键值对 |
ZSET(有序集合) | 字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定 | 添加、获取、删除单个元素;根据分值范围(range)或者成员来获取元素 |
1. 字符串 STRING
Redis字符串是一个字节序列。在Redis中字符串是二进制安全的,这意味着它们没有任何特殊终端字符来确定长度,所以可以存储任何长度为512M的字符串。
命令(其它的以后遇到再补充):
- SET 设置存储在给定键中的值
- GET 获取存储在给定键中的值
- DEL 删除存储在给定键中的值(适用于所有类型)
如:
derek@root:~$ redis-cli
127.0.0.1:6379> SET name "Derek"
OK
127.0.0.1:6379> GET name
"Derek"
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> get name
"Derek"
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379>
2. 列表 LIST
Redis列表是简单的字符串列表,通过插入顺序排序。可以添加一个元素到Redis列表的头部或尾部(也可以说左部和右部,反正都是一样的)
列表的最大长度为:2^32 - 1 个元素(4294967295, 每个列表的元素超过四十亿)
命令(其它的以后遇到再补充):
- LPUSH 将给定值推入列表的左端
- RPUSH 将给定值推入列表的右端
- LPOP 从列表的左端弹出一个值,并返回被弹出的位置
- RPOP 从列表的右端弹出一个值,并返回被弹出的位置
- LINDEX 获取列表在给定位置上的单个元素
- LRANGE 获取列表在给定范围上的所有值
127.0.0.1:6379> lpush list-key item1
(integer) 1
127.0.0.1:6379> lpush list-key item2
(integer) 2
127.0.0.1:6379> rpush list-key item3
(integer) 3
127.0.0.1:6379> rpush list-key item4
(integer) 4
127.0.0.1:6379> lpush list-key item5
(integer) 5
127.0.0.1:6379> rpush list-key item6
(integer) 6
127.0.0.1:6379> lrange list-key 0 -1
1) "item5"
2) "item2"
3) "item1"
4) "item3"
5) "item4"
6) "item6"
127.0.0.1:6379> lindex list-key 2
"item1"
127.0.0.1:6379> lpop list-key
"item5"
127.0.0.1:6379> lrange list-key 0 -1
1) "item2"
2) "item1"
3) "item3"
4) "item4"
5) "item6"
127.0.0.1:6379> rpop list-key
"item6"
127.0.0.1:6379> lrange list-key 0 -1
1) "item2"
2) "item1"
3) "item3"
4) "item4"
127.0.0.1:6379> lindex list-key 2
"item3"
127.0.0.1:6379>
从上面的例子简单的操作了LIST,并且可以看出几个注意点:
- lrange list-key 0 -1 这条命令,使用0为范围的起始索引,-1为范围的结束索引,可以取出列表中包含中的所有元素。
- LIST的下表是从 0 开始的(lindex list-key 2取出的是第三个值)(lrange命令查出的标号是从1开始)
3. 集合 SET
Redis的集合和列表都可以存储多个字符串,它们的不同在于,列表可以存储多个相同的字符串,而集合则通过使用散列表来保证自己存储的每个字符串都是各不相同(这些散列表只有键,但没有与键相关联的值)。
因为Redis的集合使用无需(unordered)方式存储元素,所以用户不能像使用列表那样,将元素推入集合的某一端,或者从集合的某一端弹出元素。
集合中成员的最大数量为: 2^32 -1 (4294967295, 每个集合超过四十亿条数据)
命令(其它的以后遇到再补充):
- SADD 将给定元素添加到集合
- SREM 如果给定元素存在于集合中,那么移除这个元素
- SISMEMBER 快速的检查一个元素是否存在于集合中
- SMEMBERS 获取集合中的所有元素(如果集合包含的元素非常多,那么SMEMBERS命令的执行速度可能会很慢,慎用)
- SINTER 交集
- SUNION 并集
- SDIFF 差集
127.0.0.1:6379> sadd set-key item1
(integer) 1
127.0.0.1:6379> sadd set-key item2
(integer) 1
127.0.0.1:6379> sadd set-key item3
(integer) 1
127.0.0.1:6379> sadd set-key a-item1
(integer) 1
127.0.0.1:6379> sadd set-key c-item1
(integer) 1
127.0.0.1:6379> sadd set-key b-item1
(integer) 1
127.0.0.1:6379> smembers set-key
1) "a-item1"
2) "item2"
3) "item1"
4) "item3"
5) "b-item1"
6) "c-item1"
127.0.0.1:6379> sismember set-key item2
(integer) 1
127.0.0.1:6379> sismember set-key item6
(integer) 0
127.0.0.1:6379> srem set-key item2
(integer) 1
127.0.0.1:6379> sismember set-key item2
(integer) 0
127.0.0.1:6379> smembers set-key
1) "item3"
2) "b-item1"
3) "c-item1"
4) "item1"
5) "a-item1"
127.0.0.1:6379> sadd set-key item3
(integer) 0
127.0.0.1:6379> smembers set-key
1) "item3"
2) "b-item1"
3) "c-item1"
4) "item1"
5) "a-item1"
127.0.0.1:6379>
4. 哈希 HASH
Redis的哈希(或者说 散列)可以存储多个键值对之间的映射。和字符串一样,散列存储的值既可以是字符串,又可以是数字值,并且用户同样可以对散列存储的数字值执行自增操作或者自减操作。
散列在很多方面就像是一个微缩版(猥琐版��)的Redis,不少字符命令都有相应的散列版本。
命令(其它的以后遇到再补充):
- HSET 在散列里面关联起给定的键值对
- HGET 获取制定散列键的值
- HGETALL 获取散列包含的所有键值对
- HDEL 如果给定键存在于散列里面,那么移除这个键
127.0.0.1:6379> hset hash-key sub-key value1
(integer) 1
127.0.0.1:6379> hset hash-key sub-key value2
(integer) 0
127.0.0.1:6379> hset hash-key sub-key2 value2
(integer) 1
127.0.0.1:6379> hgetall hash-key
1) "sub-key"
2) "value2"
3) "sub-key2"
4) "value2"
127.0.0.1:6379> hgetall hash-key sub-key
(error) ERR wrong number of arguments for 'hgetall' command
127.0.0.1:6379> hget hash-key sub-key
"value2"
127.0.0.1:6379> hdel hash-key sub-key2
(integer) 1
127.0.0.1:6379> hgetall hash-key
1) "sub-key"
2) "value2"
127.0.0.1:6379> hget hash-key sub-key2
(nil)
127.0.0.1:6379> hget hash-key sub-key
"value2"
27.0.0.1:6379> hset hash-key2 sub-key value1
(integer) 1
127.0.0.1:6379> hset hash-key2 sub-key2 value1
(integer) 1
127.0.0.1:6379> hgetall hash-key2
1) "sub-key"
2) "value1"
3) "sub-key2"
4) "value1"
127.0.0.1:6379> hgetall hash-key
1) "sub-key"
2) "value2"
127.0.0.1:6379> del hash-key
(integer) 1
127.0.0.1:6379> hgetall hash-key
(empty list or set)
通过这个例子可以看出:
- hset hash-key sub-key value2 设置时,sub-key已存在,得到的是(integer) 0,但其实value值被替换了。也可以说是当sub-key存在时,覆盖成功返回 0
- hgetall hash-key得到是所有的 key & value
5. 有序集合 ZSET
有序集合和散列一样,都用于存储键值对;有序集合的键被称为成员(member),每个成员都是各不相同的;而有序集合的值被称为分值(score),分值必须是浮点数。有序集合是Redis里面唯一一个既可以根据成员访问元素(和散列一样),又可以根据分值以及分值的排列顺序来访问元素的结构。
命令(其它的以后遇到再补充):
- ZADD 将一个带有给定分值的成员添加到有序集合里面
- ZRANGE 根据元素在有序集合中所处的位置,从有序集合里面获取多个元素
- ZRANGEBYSCORE 获取有序集合在给定分值范围内的所有元素
- ZREM 如果给定成员存在于有序集合,那么移除这个成员
127.0.0.1:6379> zadd zset-key 1 member1
(integer) 1
127.0.0.1:6379> zadd zset-key 2 member2
(integer) 1
127.0.0.1:6379> zadd zset-key 3 member3
(integer) 1
127.0.0.1:6379> zadd zset-key 4 member1
(integer) 0
127.0.0.1:6379> zadd zset-key 5 member5
(integer) 1
127.0.0.1:6379> zrange zset-key 0 -1
1) "member2"
2) "member3"
3) "member1"
4) "member5"
127.0.0.1:6379> zrangebyscore zset-key 3 4 withscores
1) "member3"
2) "3"
3) "member1"
4) "4"
127.0.0.1:6379> zrem zset-key member3
(integer) 1
127.0.0.1:6379> zrem zset-key member3
(integer) 0
127.0.0.1:6379> zrange zset-key 0 -1
1) "member2"
2) "member1"
3) "member5"
127.0.0.1:6379>
从上面的例子可以看出:
- zrange 命令查出得到的是:键
- zrangebyscore zset-key 3 4, 这个范围包含自身(<= & >=)
未完待续……