redis 用 c 语言编写 ,是单线程的 , 执行效率高。
Redis 与其他 key - value 缓存产品有以下三个特点:
-
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
-
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
-
Redis支持数据的备份,即master-slave模式的数据备份。
1. Redis 数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
2. Redis 键 (key)
用于操作管理redis的键
命令 | 描述 |
---|---|
del [key] | 在key存在时删除key |
exists [key] | 判断key是否存在 |
expire [key] [time] | 为key设置过期时间 单位:秒 |
keys [pattern] | 模式匹配key |
move [key] [db] | 将key移动至给定数据库db |
persist [key] | 移除key的过期时间 |
ttl [key] | 返回key的剩余时间 |
rename [key] [newkey] | 修改key的名称 |
3. Redis 字符串
命令 | 描述 |
---|---|
set [key] [value] | 设置key的值,已存在则覆盖 |
setnx [key] [value] | 设置key的值,已存在不执行 |
mset [key] [value] … | 批量设置key的值,已存在则覆盖 |
msetnx [key] [value] … | 批量设置key的值,已存在不执行 |
get [key] | 获取指定key的值 |
mget [key1] [key2] … | 获取多个key值 |
getrange [key] [start] [end] | 从start和end之间截取key的value值 |
getset [key] [value] | 将指定的key值修改为value ,并返回未修改之前的value |
incr [key] | value 增 1 |
incrby [key] [num] | 将给定的key增加num, num为整数 |
incrbyfloat [key] [num] | 将给定的key增加num,num可以为float型 |
decr [key] | value 减 1 |
decrby [key] [num] | 将给定的key减少num,value为整数 |
strlen [key] | 返回key字符串长度 |
4. Redis 哈希 (Hash)
redis hash 是一个string类型的field和value的映射表,一般用于储存对象。
命令 | 描述 |
---|---|
hmset [key] [field value] … | 同时将多个 field-value (域-值)对设置到哈希表 key 中 |
hset [key] [field] [value] | 将哈希表key中的field字段设置为value |
hsetnx [key] [field] [value] | 将哈希表key中的field字段设置为value ,field不存在时设置,存在不执行 |
hgetall [key] | 获取key的所有字段和值 |
hmget [key] [field1] [field2] … | 获取key的所有给定字段field的值value |
hkeys [key] | 获取哈希表中所有的key |
hlen [key] | 获取哈希表key中字段的数量 |
hexists [key] [field] | 查看哈希表中指定的field是否存在 |
hincrby [key] [field] [num] | 为哈希表 key 中的指定字段的值加上增量num (整数) |
hincrbyfloat [key] [field] [num] | 为哈希表 key 中的指定字段的值加上增量num (浮点数) |
5. Redis 列表 (List)
redis list 是一个由多个字符串组成的列表, 按插入顺序排序
命令 | 描述 |
---|---|
lpush [key] [value1, value2 …] | 将一个或多个value值插入列表key头部 |
rpush [key][value1, value2 …] | 将一个或多个value值插入列表key尾部 |
lpushx [key] [value] | 将一个值插入到一个已存在的列表头部 |
rpushx [key] [value] | 将一个值插入到一个已存在的列表尾部 |
lpop [key] | 移除,并获取列表第一个元素 |
rpop [key] | 移除,并获取列表最后一个元素 |
blpop [key1 key2 …] [timeout] | 移除,并获取列表第一个元素,如果列表没有元素,等待数据,直至超时,可以存在多个key |
brpop [key1 key2 …] [timeout] | 移除,并获取列表最后一个元素,如果列表没有元素,等待数据,直至超时,可以存在多个key |
lset [key] [index] [value] | 通过索引index设置列表key的value值 |
ltrim [key] [start] [stop] | 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。 |
llen [key] | 获取列表长度 |
6. Redis 集合 (Set)
redis set 是一个String类型的无序集合,集合成员是唯一的。
命令 | 描述 |
---|---|
sadd [key] [members …] | 向集合添加一个或多个成员 |
scard [key] | 获取集合的成员数 |
sdiff [key1, key2 ,key3 …] | 返回第一个集合和其他集合的差异 |
sdiffstore [key0] [key1, key2 …] | 返回给定所有集合key1, key2 … 的差集,结果储存在key0中 |
sinter [key1, key2 …] | 返回给定所有集合的交集 |
sinterstore [key0] [key1,key2 …] | 返回给定所有集合key1, key2 … 的交集,结果储存在key0中 |
sismember [key] [member] | 判断member元素是否是集合key的成员 |
sunion [key1,key2 …] | 返回所有给定集合的并集 |
sunionstore [key0] [key1, key2 …] | 返回给定所有集合key1, key2 … 的并集,结果储存在key0中 |
smembers [key] | 返回集合中所有成员 |
spop [key] | 移除并返回集合中的一个随机元素 |
srandmember [key] [count] | 返回集合中一个或多个随机数 |
srem [key] [member , …] | 移除集合中一个或多个成员 |
… | … |
7. Redis 发布订阅
redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis 客户端可以订阅任意数量的频道。
创建订阅频道名 redisChat
127.0.0.1:6379> subscribe redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1
打开另一个redis客户端,在同一个频道redisChat发送消息,订阅者就能收到消息
127.0.0.1:6379> publish redisChat "java is a best language"
(integer) 1
接收端:
127.0.0.1:6379> subscribe redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1
1) "message"
2) "redisChat"
3) "java is a best language"
redis发布订阅常用命令
命令 | 描述 |
---|---|
subscribe [pattern, pattern ,…] | 订阅一个或多个频道 |
publish [channel] [message] | 将信息发送到指定频道 |
psubscribe [pattern, pattern ,…] | 订阅一个或多个符合给定模式的频道 |
punsubscribe [pattern, pattern …] | 退订所有给定模式的频道 |
pubsub subcommand [argument ,argument …] | 查看订阅与发布系统状态 |
UNSUBSCRIBE [channel ,channel …] | 指退订给定的频道 |
8. Redis 事务
Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:
-
事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
-
事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
一个事务从开始到执行会经历以下三个阶段:
-
开始事务。
-
命令入队。
-
执行事务。
实例
以下是一个事务的例子, 它先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令:
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED
redis 127.0.0.1:6379> GET book-name
QUEUED
redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED
redis 127.0.0.1:6379> SMEMBERS tag
QUEUED
redis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
2) "C++"
3) "Programming"
redis事务常用命令
命令 | 描述 |
---|---|
discard | 取消事务,放弃执行事务块内的所有命令。 |
exec | 执行所有事务块内的命令 |
multi | 标记一个事务块的开始 |
unwatch | 取消 WATCH 命令对所有 key 的监视 |
watch [key , key …] | 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。 |
9. java操作redis
使用jedis操作redis
public static void main( String[] args )
{
// 获取连接
Jedis jedis = new Jedis("localhost", 6379);
// 执行指令
jedis.set("username","xiaoming");
// 关闭连接
jedis.close();
}
使用spring data jedis 操作redis
application.yml 配置redis
spring:
redis:
host: localhost # IP
port: 6379 # 端口号
passwird: 123456 # 密码
database: 0 # 操作的数据库
jedis:
# redis连接池配置
pool:
max-active: 8 # 最大连接数
max-wait: 1ms # 连接池最大阻塞等待时间
max-idle: 4 # 连接池中最大空闲连接
min-idle: 0 # 连接池中最小空闲连接