前言
REmote Dictionary Server(Redis)是一个由Salvatore Sanfillppo写的key-value存储系统。
Redis是一个开源的使用ANSUI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、key-value数据库,并提供多种语言的API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
需要提前掌握的知识
- 基本的数据结构
- String/Hash/List/Set/Sorted Set
- 特点:
- 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启时可以再次进行使用;
- 不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储;
- 支持数据的备份,即master-slave模式的数据备份。
- Redis优势
- 性能极高,读写速度快;
- 丰富的数据类型,redis支持二进制案例的String,List,Hashes,Sets及Ordered Sets数据类型操作。
- 原子,redis的所有操作都是原子性的,要么成功执行要么完全不执行。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性,支持publish/subscribe,通知,key过期等等特性。
初级部分
Redis安装
- Windows下安装
- Ubuntu下安装
- cloud studio中运行redis
Redis配置
配置文件在redis安装目录下,文件名为redis.conf可以通过CONFIG命令来查看或设置配置项。
- 语法
redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME
# use * get config programs
redis 127.0.0.1:6379> CONFIG GET *
编辑配置
可以通过修改redis.conf文件或使用CONFIG set命令来修改配置
- 语法
redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE
# 实例
redis 127.0.0.1:6379> CONFIG SET loglevel "notice"
OK
redis 127.0.0.1:6379> CONFIG GET loglevel
1) "loglevel"
2) "notice"
参数说明
Redis数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
String字符串
- string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
- string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
- string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
实例
redis 127.0.0.1:6379> SET name "runoob" OK redis 127.0.0.1:6379> GET name "runoob"
- ⚠️一个键最大能存储512MB
Hash哈希
使用DEL runoob删除前面测试用过的可以,不然会报错!
redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> HMSET myhash field1 "Hello" field2 "World"
"OK"
redis 127.0.0.1:6379> HGET myhash field1
"Hello"
redis 127.0.0.1:6379> HGET myhash field2
"World"
实例中我们使用了 Redis HMSET, HGET 命令,HMSET 设置了两个 field=>value 对, HGET 获取对应 field 对应的 value。
每个 hash 可以存储 232 -1 键值对(40多亿)。
List列表
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
# 使用lpush命令向列表中插入数据
lpush runoob redis
lpush runoob python
lrange runoob 0 10
1) "python"
2) "redis"
- 列表最多可以存储$2^{32} - 1$个元素,每个列表可存储40多亿。
SET集合
- Redis的Set是string类型的无序集合。
- 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
sadd命令
添加一个 string 元素到 key 对应的 set 集合中,成功返回1,如果元素已经在集合中返回 0,如果 key 对应的 set 不存在则返回错误。
sadd runoob redis
sadd runoob python
sadd runoob python
sadd runoob C++
smembers runoob
1) "redis"
2) "C++"
3) "python"
- 以上实例中 rabitmq 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。
- 集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。
zset(sorted set:有序集合)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
zadd命令
添加元素到集合,元素在集合中存在则更新对应score
zadd key score member
# 实例
redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> zadd runoob 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> > ZRANGEBYSCORE runoob 0 1000
1) "mongodb"
2) "rabitmq"
3) "redis"
Redis命令
是用于在redis服务器上执行操作,要在 redis 服务上执行命令需要一个 redis 客户端。Redis 客户端在我们之前下载的的 redis 的安装包中。
具体学习地址(中文简体教程)
Redis用于管理的命令
- 键Key命令:用于管理redis的键。基本命令非常多!
- String命令:用于管理redis的字符串值。
- Hash命令:
- List命令:
- Set集合命令:用于管理redis的集合类型值。
- Redis有序集合命令:
Redis HyperLogLog
是用来做基数统计的算法,HyperLogLog的优点是在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的并且是非常小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
HyperLogLog只计算基数,不存储输入的元素本身。
基数
即一个数据集中不重复元素的个数。基数估计就是在误差可接收范围内,快速计算基数。
# 实例
PFADD runoobkey "redis"
1
PFADD runoobkey "python"
1
PFADD runoobkey "java"
1
PFCOUNT runoobkey
3
Redis HyperLogLog命令
基本命令
PFADD key element [element ...]
添加指定元素到 HyperLogLog 中。PFCOUNT key [key ...]
返回给定 HyperLogLog 的基数估算值。PFMERGE destkey sourcekey [sourcekey ...]
将多个 HyperLogLog 合并为一个 HyperLogLog
Redis 发布订阅
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 客户端可以订阅任意数量的频道。
常用命令
PSUBSCRIBE pattern [pattern ...]
订阅一个或多个符合给定模式的频道。PUBSUB subcommand [argument [argument ...]]
查看订阅与发布系统状态。PUBLISH channel message
将信息发送到指定的频道。PUNSUBSCRIBE [pattern [pattern ...]]
退订所有给定模式的频道。SUBSCRIBE channel [channel ...]
订阅给定的一个或多个频道的信息。UNSUBSCRIBE [channel [channel ...]]
指退订给定的频道。
redis 事务
Redis事务可以一次执行多个命令。并且带有以下几个重要的保证:
- 批量操作在发送 EXEC 命令前被放入队列缓存。
- 到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
- 事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
- 事务从开始到执行经历三个阶段:
- 开始事务
- 命令入队
- 执行事务
# 实例
redis 127.0.0.1:6379> MUTI # 开始一个事务
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"
1) "C++"
2) "Programming"
- ⚠️ 单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
redis 事务命令
1、 DISCARD : 取消事务,放弃执行事务内的所有命令
2、 EXEC: 执行所有事务块内的命令
3、 MUTI: 标记一个事务块的开始
4、 UNWATCH: 取消WATCH命令对所有key的监视。
5、 WATCH key[key ...]:监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
redis 脚本
使用Lua解释器来执行脚本。redis2.6版本通过内嵌支持Lua环境。执行脚本的常用命令为EVAL。
# 实例
redis 127.0.0.1:6379> "return {KEYS[1], KEYs[2], ARGV[1], ARGV[2]}" 2 key1 key2 first second
1) "key1"
2) "key2"
3) "first"
4) "second"
脚本命令
EVAL script numkeys key [key ...] arg [arg ...]
执行 Lua 脚本。EVALSHA sha1 numkeys key [key ...] arg [arg ...]
执行 Lua 脚本。SCRIPT EXISTS script [script ...]
查看指定的脚本是否已经被保存在缓存当中。SCRIPT FLUSH
从脚本缓存中移除所有脚本。SCRIPT KILL
杀死当前正在运行的 Lua 脚本。SCRIPT LOAD script
将脚本 script 添加到脚本缓存中,但并不立即执行这个脚本。
Redis连接
主要用于连接redis服务
# 实例 演示客户端如何通过密码验证连接到 redis 服务,并检测服务是否在运行
AUTH "password"
OK
PING
PONG
基本命令
- AUTH password: 验证密码是否正确
- ECHO message: 打印字符串
- PING: 查看服务是否运行
- QUIT: 关闭当前连接
- SELECT index: 切换到指定的数据库
Redis 服务器
主要用于管理redis服务
高级部分
Redis 数据备份与恢复
使用SAVE命令创建当前数据库的备份。
# 语法|实例
redis 127.0.0.1:6379> SAVE
# 该命令在redis安装目录中创建dump.rdb文件
# 也可使用Bgsave命令,该命令在后台执行
redis 127.0.0.1:6379> BGSAVE
Background saving started
恢复数据
如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可。获取 redis 目录可以使用 CONFIG 命令,如下所示:
redis 127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/usr/local/redis/bin"
Redis 安全
可以通过 redis 的配置文件设置密码参数,这样客户端连接到 redis 服务就需要密码验证,这样可以让你的 redis 服务更安全。
详细介绍
性能测试
Redis 性能测试是通过同时执行多个命令实现的。
客户端连接、管道技术、分区
Java使用Redis
安装
开始使用前需要安装redis服务和Java redis驱动:
- 下载jedis.jar驱动包,(确保下载最新驱动包)
- 在classpath中包含该驱动
连接redis服务
// 实例
import redis.clients.jedis.Jedis;
public class RedisJava{
public static void main(String[] args){
//连接本地的redis服务
Jedis jedis = new Jedis("locahost");
System.out.println("连接成功!");
//查看服务是否运行
System.out.println("服务正在运行: " + jedis.ping);
}
}
// String 实例
import redis.clients.jedis.Jedis;
public class RedisStringJava {
public static void main(String[] args) {
//连接本地的 Redis 服务
Jedis jedis = new Jedis("localhost");
System.out.println("连接成功");
//设置redis 字符串数据
jedis.set("runoobkey", "www.ok.com");
//获取存储的数据并输出
String strings = jedis.get(runoobkey);
System.out.println("redis 存储的字符串为:" + strings);
}
}
// List实例
import java.util.List;
import redis.clients.jedis.Jedis;
public class RedisListJava {
public static void main(String[] args) {
//连接本地的 Redis 服务
Jedis jedis = new Jedis("localhost");
System.out.println("连接成功");
//存储数据到列表中
jedis.lpush("site-list", "Runoob");
jedis.lpush("site-list", "Google");
jedis.lpush("site-list", "Taobao");
// 获取存储的数据并输出
List<String> list = jedis.lrange("site-list", 0 ,2);
for(int i=0; i<list.size(); i++) {
System.out.println("列表项为: "+list.get(i));
}
}
}
// redis java keys 实例
import java.util.Iterator;
import java.util.Set;
import redis.clients.jedis.Jedis;
public class RedisKeyJava{
public static void main(String[] args){
//连接本地的 Redis 服务
Jedis jedis = new Jedis("localhost");
System.out.println("连接成功");
//获取数据并输出
Set<String> keys = jedis.keys("*");
Iterator<String> it = keys.iterator();
while(it.hasNext()){
String key = it.next();
System.out.println(key);
}
}
}
/**
输出:
runoobkey
site-list
*/
本文是基于RUNOOB-Redis教程编写的学习笔记,只做个人知识库使用!首次发布于 YunLongBlog, 作者 Laqudee ,转载请保留原文链接.