我与狗子的日常3
Redis 进阶之路
Redis安装
redis简介:
redis是NOSQL(not only sql,非关系型数据库)的一种,NoSQL是以Key-Value的形式存储数据,当前主流的分布式缓存技术有Redis, memcached,ssdb,mongodb 等。可以把redis理解为缓存技术,因为它的数据都是缓存在内存中,也可以理解为数据库,因为redis可以周期性的将数据写入磁盘或者把操作追加到记录文件中。
redis与其他key-value的缓存产品相比有以下三个特点:
1.Redis支撑数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
2.Redis不仅仅支持简单的key-value类型的数据,同时还提供list set zset hash等数据结构的存储。
3.Redis支持数据的备份,即master-slave模式的数据备份。
优点:
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作
原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性
Linux 下安装redis
编译源程序:
[root@localhost ftpuser]# tar zxvf redis-3.2.0.tar.gz
[root@localhost ftpuser]# cd redis-3.2.0
[root@localhost redis-3.2.0]# make
[root@localhost redis-3.2.0]# cd src && make install
创建目录存放redis命令和配置文件
[root@localhost redis-3.2.0]# mkdir -p /usr/local/redis/bin
[root@localhost redis-3.2.0]# mkdir -p /usr/local/redis/etc
移动文件:
[root@localhost redis-3.2.0]# mv redis.conf /usr/local/redis/etc
[root@localhost redis-3.2.0]# cd src
[root@localhost src]# mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel redis-trib.rb /usr/local/redis/bin
启动redis:
[root@localhost ~]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
验证是否启动成功:
[root@localhost ~]# ps -ef | grep redis
#或者
[root@localhost ~]# netstat -tunpl | grep 6379
Redis客户端连接:
[root@localhost ~]# /usr/local/redis/bin/redis-cli -h 192.168.2.128 -p 6379
192.168.2.128:6379> info
# Server
redis_version:3.2.0
redis_git_sha1:00000000
停止redis:
[root@localhost ~]# /usr/local/redis/bin/redis-cli shutdown
#或者
[root@localhost ~]# pkill redis-server
redis数据结构(内存模型)及常用命令
redis数据类型:
redis支持的数据类型有五种:String、List、Hash、Set和Sorted Set.
Redis 数据类型内存结构分析:
Redis内部使用一个RedisObject对象来表示所有的key和value,redisObject主要的信息包括数据类型type 编码方式encoding 数据指针ptr 虚拟内存vm 等。type表示value的数据类型。
String:是最常用的一种数据类型,普通的key/value存储都可以归为此类。
string类型的值最大能存储512MB
1. SET key value
设置指定 key 的值
2. GET key
获取指定 key 的值。
3. GETSET key value
将给定 key 的值设为 value ,并返回 key 的旧值(old
value)。
4. SETEX key seconds value
将值 value 关联到 key ,并将 key 的过期时间设为
seconds (以秒为单位)。
5.SETNX key value
只有在 key 不存在时设置 key 的值。
6. STRLEN key
返回 key 所储存的字符串值的长度。
Hash:redis hash是一个键值对集合 string类型的field 和 value的映射表,hash特别适合用于存储对象。
每个 hash可以存储232-1 个键值对(40多亿)
1. HDEL key field1 [field2]
删除一个或多个哈希表字段
2. HEXISTS key field
查看哈希表 key
中,指定的字段是否存在。
3. HGET key field
获取存储在哈希表中指定字段的值。
4. HGETALL key
获取在哈希表中指定
key 的所有字段和值
5. HKEYS key
获取所有哈希表中的字段
6. HLEN key
获取哈希表中字段的数量
7. HMSET key field1 value1 [field2 value2 ]
同时将多个
field-value (域-值)对设置到哈希表 key 中。
8. HSET key field value
将哈希表 key 中的字段 field 的值设为 value 。
9. HSETNX key field value
只有在字段
field 不存在时,设置哈希表字段的值。
10.
HVALS key
获取哈希表中所有值
11.
HSCAN key cursor [MATCH pattern] [COUNT count]
迭代哈希表中的键值对。
List:Redis列表是简单的字符串列表。按照插入顺序排序。
插入数据:Lpush 列表名 value
查询数据:lrange 列表 0 10
List 最多可存储232-1 个元素
1. BLPOP key1 [key2 ] timeout
移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
2. BRPOP key1 [key2 ] timeout
移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
3. LINDEX key index
通过索引获取列表中的元素
4. LLEN key
获取列表长度
5. LPOP key
移出并获取列表的第一个元素
6. LPUSH key value1 [value2]
将一个或多个值插入到列表头部
7. LSET key index value
通过索引设置列表元素的值
8. LTRIM key start stop
对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
9. RPOP key
移除并获取列表最后一个元素
10.
RPUSH key value1 [value2]
在列表中添加一个或多个值
11.
RPUSHX key value
为已存在的列表添加值
Set:Redis的set是string 类型的无序集合 set集合是通过哈希表实现的,所以添加删除查找的复杂度都是O(1)。
Sadd: 添加一个key到对应的set集合,返回1表示成功,返回0表示元素已存在集合中。如果key对应的集合不存在,则返回错误。
Set集合的最大成员是数为232-1 个元素。
1. SADD key member1 [member2]
向集合添加一个或多个成员
2. SCARD key
获取集合的成员数
3. SDIFF key1 [key2]
返回给定所有集合的差集
4. SDIFFSTORE destination key1 [key2]
返回给定所有集合的差集并存储在 destination 中
5. SINTER key1 [key2]
返回给定所有集合的交集
6. SINTERSTORE destination key1 [key2]
返回给定所有集合的交集并存储在 destination 中
7. SISMEMBER key member
判断 member
元素是否是集合 key 的成员
8. SMEMBERS key
返回集合中的所有成员
9. SMOVE source destination member
将 member 元素从 source 集合移动到 destination 集合
10.
SPOP key
移除并返回集合中的一个随机元素
11.
SRANDMEMBER key [count]
返回集合中一个或多个随机数
ZSet:有序结合 Zset的每个元素都会关联一个double类型的分数,redis正是通过分数来为集合的成员进行从小到大的排序,Zset的成员是唯一的,但分数可以重复。
1. ZADD key score1 member1 [score2 member2]
向有序集合添加一个或多个成员,或者更新已存在成员的分数
2.ZCARD key
获取有序集合的成员数
3. ZCOUNT key min max
计算在有序集合中指定区间分数的成员数
4. ZRANK key member
返回有序集合中指定成员的索引
5. ZSCORE key member
返回有序集中,成员的分数值
6. ZREVRANGEBYSCORE key max min [WITHSCORES]
返回有序集中指定分数区间内的成员,分数从高到低排序
Redis键
Redis键命令的基本语法如下:
Command key_name
1.del key:当key存在时,删除key
2.dump key: 序列化key,并返回被序列化的值
3.exists key: 检查key是否存在
4.expire key seconds:为key设置过期时间
5.keys pattern: 查找所有符合给定模式的key
6.move key db: 将当前的数据库的key移动到给定的数据db中
7.persist key:移除key的过期时间,key将持久保持
8.randomkey:从当前数据库随机返回一个key
9.rename key newkey:修改key的名称
10.renamenx key newkey: 仅当newkey 不存在时,将key改名为newkey
11.type key:返回key所存储的的类型
Redis 事务
Redis事务可以一次执行多个命令
批量操作再发送EXEC命令前被放入队列缓存;
收到EXEC命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行;
在事务执行过程中,其他客户端提交的命令请求不会插入到事务执行的命令序列中;
一个事务从开始到执行的三个阶段:
开始事务à命令入队à执行事务
原子性:
单个Redis命令的执行是原子性的,但Redis在事务上没有增加任何维持原子性的机制,所以Redis事务的执行并不是原子性的。
Redis官网的说明:
It's important to note that even when a command fails, all the other commands in the queue are processed – Redis will not stop the processing of commands.
Eg:
multi
set a aaa
set b bbb
set c ccc
exec
如果set b bbb 失败了,则set a aaa 不会回滚,set c ccc 还会继续执行
Redis 事务命令:
DISCARD 取消事务,放弃执行事务块内的所有命令
EXEC 执行所有事务块内的命令
MULTI 标记一个事务块的开始
UNWATCH 取消WATCH 命令对所有key的监视
WATCH KEY[ KEY…..] 监视一个或多个key,如果在事务执行之前这些key被其他命令所改动,那么事务将被打断。
Redis数据备份与恢复
Save 命令用于创建当前数据库的备份
语法: save
该命令将在redis安装目录中创建dump.rdb文件
恢复数据
只需将备份文件(dump.rdb)移动到安装目录并启动服务即可,获取redis目录可以使用config命令 config get dir
Redis 管道技术
redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务,遵循以下步骤:
客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应;
服务端处理命令,并将结果返回给客户端。
略……