一、Redis简介:
Redis = REmote DIctionary Server, key-value数据库。
特点是:
(1)性能极高,读写速度快;
(2)运行在内存中,亦可持久化到磁盘上;
(3)不仅仅支持简单的key-value,同时提供list、hash、set、zset多种数据结构;
(4)支持master-slave模式数据的备份。
使用方法:
默认安装目录:
/usr/local/bin/
默认启动为前台方式,改为后台守护进程形式运行:
mkdir /etc/redis
vi /etc/redis/6379.conf
//dameonize no ==> dameonize yes
./redis-server /etc/redis/6379.conf
带密码的方式启动客户端:
vi /etc/redis/6379.conf
//# requirepass foobared ==> requirepass myredis
./redis-cli -h 127.0.0.1 -p 6379 -a myredis
启动命令:
./redis-server
./redis-cli
二、Redis基本数据类型:
Redis支持五种数据类型:
string(字符串);
hash(哈希);
list(列表);
set(集合);
zset(有序集合:sorted set)。
1. 字符串:string
string类型是redis最基本的数据类型,一个key对应一个value,string类型是二进制安全的,意思是redis的string可以包含任何数据, 比如jpg图片,但有最大存储限制是512MB。
set key value //插入key-value
get key // 获取value
mset key1 value1 key2 value2 key3 value3 //批量插入
mget key1 key2 key3 //批量获取
string类型的附加操作:
incr key
incrby key increment
decr key
decrby key decrement
Redis应该尽量以批量的形式操作,因为TCP有头部开销。
2. 哈希:hash
在redis的key-value模型中,hash的value格式是 (field, value), 相当于value中存着的是map。
hset key field value
hget key field
hmset k1 f1 v1 k1 f2 v2
hmget k1 f1 k1 f2
3. 列表:list
redis中的列表形式跟双向链表相仿,支持元素的左、右插入和访问。
lpush key v1
rpush key v2
lrange key start end
lpop key
rpop key
lpush key v1 v2 v3 //链表的批量插入
rpush key v1 v2 v3
4. 集合:set
redis中的集合是无序集合,集合中的元素类型是string,set通过哈希表实现,因此添加、删除、访问的时间复杂度都是O(1)。
sadd key value
smembers key
set中的元素不允许有重复的,插入一个元素成功则返回1,如果集合中已经存在相同元素,则返回0。
5. 有序集合:zset
zset有序集合中,每个元素都会关联一个double类型的分数(权值),按权值从小到大有序存储。
zadd key score member
zrange key start end //按照元素下标访问
zrangebyscore key start end //按照权值范围访问
三、Redis发布订阅(pub/sub):
pub/sub是一种消息通信模式,在多个客户端之间进行通信。
需要接收消息的客户端先订阅频道(channel),发送方向channel中发送数据,订阅此频道的所有接收端都会收到消息。
subcribe my_channel //订阅频道
publish my_channel "my_message" //向频道中发送消息
unsubscribe channel //退订频道
psubscribe channel1 channel2 //批量订阅
punsubscribe channel1 channel2 //批量退订
四、Redis事务:
一个redis事务的执行过程:
开始事务 --> 命令入队 --> 执行事务 --> 执行完毕
注意:
- Redis事务可以理解为一个打包的批量执行脚本执行批量指令,并不是原子化的操作,中间某条指令的失败不会导致前面已执行指令的回滚,也不会造成后序指令的不执行;
- 从multi指令开始事务,从exec指令开始执行事务,在exec之后到事务执行完毕之前,Redis整个库都是被锁住的状态,其他客户端无法进行任何操作;在multi到exec之间这段命令入队的阶段,数据库不上锁。
multi //开始事务
//一些指令...
exec //执行上述入队的所有指令
//或者:
discard //不执行,放弃事务块内的所有指令