Redis
Remote Dictionary Server(Redis)是个由Salvatore sanfilippo 写的key-value存储系统。
Redis是一个开源的,使用ANSIC语言编写,遵守BSD协议,支持网络,可基于内存,亦可持久化的日志型 key-value 数据库。并提供多种语言的API。
它通常被称为数据结构服务器,因为value可以是字符串(String),哈希(Hash),列表(list),集合(sets)和有序集合(Sort Sets)等类型。
Redis简介
是开源免费的,基于BSD协议,是一个高性能的key-value数据库。
Redis与其他key-value缓存产品有以下三个特点
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载使用。
- Redis不仅仅支持简单的key-value存储,还支持Hash,List,Set,Zset等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
优势
- 性能极高,读的速度110000次/秒,写的速度81000次/秒。
- 丰富的数据类型,String,Hash,List,Set,OrderedSets.
- 原子,Redis所有操作都是原子性的,要么执行成功,要么执行失败完全不执行。单个操作是原子性的,多个操作也支持事务,即原子性通过Multi和Exec指令包起来。
- 丰富的特性,Redis还支持publish/subscribe,通知key过期等等特性。
Redis 的数据类型都是基于基本数据结构的,同时对程序员透明,无需进行额外的抽象。
Redis 运行在内存中,但是可以持久化到磁盘上,所以对不同数据集进行读写时需要权衡内存,因为数据量不能大于内存。相比在磁盘上相同的复杂数据结构,在内存操作起来非常简单。Redis可以做很多内部复杂性很强的事情。同时在磁盘格式方面,他们时紧凑的以追加的方式生产的,因为他们并不需要随机访问。
Redis的数据类型
- String (字符串) 时redis最基本的类型,一个key对应一个value。String类型是二进制安全的,意思是redis的String可以包含任何数据比如jpg图片或者序列化的对象。 String类型的值最大能存储512MB。set命令和Get命令。
- Hash(哈希) Redis Hash是一个键值对集合(key=>value). Redis Hash 是一个String类型的field和value的映射表,hash特别适合用于存储对象。HMSET命令和HGET命令。
- List(列表) redis列表是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到头部(左边)或尾部(右边)。列表最多可以存储2的32次方-1元素(4294967295 每个列表可存储40多亿元素)。lpush命令。
- Set(集合) Redis的Set是String类型的无序集合。集合是通过Hash表实现的,所以添加,删除,查找的复杂度都是O(1).sadd命令,sadd key member.
- ZSET (sorted set 有序集合) Redis Zset 和set一样也是string元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zadd命令,zadd key score member.
Redis的备份与恢复
SAVE命令用于创建当前数据库的备份。
该命令将在redis安装目录中创建dump.rdb文件。如果需要恢复数据,只需要将备份文件dump.rdb移动到redis安装目录并启动服务即可。获取redis目录可以使用Config命令。 CONFIG GET dir.
Bgsave,创建redis备份文件也可以使用BGSAVE,该命令在后台执行。
Redis安全
我们可以通过redis的配置文件设置密码参数,这样客户端连接到Redis服务就要验证密码,可以让你的Redis服务更安全。
查看是否使用了密码命令:CONFIG GET requirepass
1) “requirepass”//需要密码
2) “” //密码为空
设置密码
config set requirepass “runoob”
OK
再次查看密码 config get requirepass
1) “requirepass”
2) “runoob”//密码查出来了
使用auth验证密码 AUTH password
AUTH “runoob”
OK
Redis 性能测试
redis -benchmark [option] [option value]
$ redis -benchmark -n 10000 -q//同时执行10000个请求。
Redis性能测试工具可选参数如下
命令 | 说明 |
---|---|
-h | 指定服务器主机名 |
-p | 指定服务器端口 |
-s | 指定服务器socket |
-c | 指定并发连接数 |
-n | 指定请求数 |
-d | 以字节的形式指定 SET/GET 值的数据大小 |
-k | 1=keep alive 0=reconnect |
-r | SET/GET/INCR 使用随机 key, SADD 使用随机值 |
-P | 通过管道传输 请求 |
-q | 强制退出 redis。仅显示 query/sec 值 |
–csv | 以 CSV 格式输出 |
-l(L) | 生成循环,永久执行测试 |
-t | 仅运行以逗号分隔的测试命令列表。 |
-I(i) | Idle 模式。仅打开 N 个 idle 连接并等待。 |
redis -benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n 10000 -q
主机为127.0.0.1 ,端口号为6379,执行命令为set,lpush,请求数为10000,通过-q参数让结果只显示每秒执行的请求数。
Redis命令
redis客户端的基本语法为$redis -cli
启动redis客户端,打开终端输入命令redis -cli该命令会连接本地的redis服务。
在远程服务上执行命令,语法:
$redis -cli -h host -p port -a password
有时候会有中文乱码,加上-raw redis - cli -raw.
java使用redis
Jedis时redis推荐使用的java客户端。
<dependency>
<groupId>redis.clients<groupId>
<artifactId>jedis<artifactId>
<version>2.6.0<version>
</dependency>
Jedis jedis = new Jedis("localhost",6379);
//验证密码,如果没有设置密码这段代码可以省略
jedis.auth("password");
jedis.connect();
jedis.disconnnect();
//列出所有的key
Set<String> keys = jedis.keys("*");
//查找特定的key
Set<String> keys = jedis.key("key");
//移除给定的一个或多个key,如果key不存在,则忽略该命令
jedis.del("key1");
jedis.del("key1","key2","key3");
//设置过期时间
jedis.expire("key1",5);
//将字符串value关联到key
jedis.set("key1","value1");
//将字符串value 关联到key,并将key的生存时间设为seconds(秒)
jedis.set("key1",5,"value1")
/**
* @author minzhao赵敏
* @date 2020/3/14
*/
public class RedisUtil {
//服务ip地址
private static String ADDRESS = "127.0.0.1";
//端口号
private static int PORT = 6379;
//密码
private static String PASSWORD = "123456";
//连接到实例的最大连接数
private static int MAX_TOTAL = 1024;
//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值是8
private static int MAX_IDLE = 200;
//等待可连接的最大时间,单位毫秒,默认值-1,表示永不超时,如果超过等待时间,则直接抛出JedisConnectionException.
private static int MAX_WAIT = 10000;
//连接超时时间
private static int TIMEOUT = 10000;
//在borrow一个jedis实例时,是否提前进行validate操作,如果为true,则得到的jedis实例均是可用的。
private static boolean TEST_ON_BORROW = true;
//数据库模式时16个数据库0-15
private static final int DEFAULT_DATABASE = 0;
private static JedisPool jedisPool = null;
/**
* 初始化连接池
*/
static {
try {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(MAX_TOTAL);
config.setMaxIdle(MAX_IDLE);
config.setMaxWaitMillis(MAX_WAIT);
config.setTestOnBorrow(TEST_ON_BORROW);
jedisPool = new JedisPool(config, ADDRESS, PORT, TIMEOUT, PASSWORD, DEFAULT_DATABASE);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取Redis实例
* @return
*/
public synchronized static Jedis getJedis(){
try{
if(jedisPool!=null){
Jedis resouce=jedisPool.getResource();
return resouce;
}
else {
return null;
}
}
catch (Exception e){
e.printStackTrace();
return null;
}
}
public static void close(final Jedis jedis){
if(jedis!=null ){
jedis.close();
}
}
}
redis管道技术可以提高性能。