目录
1.2 Redis 与其他 key - value 缓存产品有以下三个特点:
一. Redis 简介
1.简介
1.1概述
1)是一款高性能的NOSQL系列的非关系型数据库
2)Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
1.2 Redis 与其他 key - value 缓存产品有以下三个特点:
1)Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
2)Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
3)Redis支持数据的备份,即master-slave模式的数据备份
2. Redis 优势
1)性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
2)丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
3)原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
4)丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
3. Redis与其他key-value存储有什么不同?
1)Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
2)Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,应为数据量不能大于硬件内存。在内存数据库方面的另一个优点是, 相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。 同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
二. Redis安装
1. Window下安装教程
2. Linux下安装教程
3. Ubuntu下安装教程
三. Redis 数据类型
Redis支持五种数据类型(value):string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
Key |
Value |
||||
Mystring |
Zhangsan |
||||
Myhash |
|
||||
Mylist |
|
||||
Myset |
|
||||
Mysort |
|
1. String(字符串)
1)string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
2)string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
3)string类型是Redis最基本的数据类型,一个键最大能存储512MB。
1.1 存储
SET KEY VALUE
1.2 获取
GET KEY
1.3 删除
DEL KEY
1.4实例
在以上实例中我们使用了 Redis 的 SET 和 GET 命令。键为 username,对应的值为zhangsan。
注意:一个键最大能存储512MB。
2. Hash(哈希)
1)Redis hash 是一个键值对集合。
2)Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
1.1 存储
HSET KEY FIELD VALUE
1.2 获取
1.获取指定的FIELD对应的值
HGET KEY FIELD
2.获取所有的FIELD和value
HGETALL KEY FIELD
1.3 删除
HDEL KEY FIELD
1.4 实例
每个 hash 可以存储 232 - 1 键值对(40多亿)。
3. List(列表)
1)Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导到表的头部(左边)或者尾部(右边)。
2)允许重复元素
1.1 添加
1. 将元素加入列表头部(左边)
LPUSH KEY VALUE
2. 将元素加入列表尾部(右边)
RPUSH KEY VALUE
1.2 获取
LRANGE KEY START END
1.3 删除
1. 删除列表最左边的元素,并将元素返回
LPOP KEY
2. 删除列表最右边的元素,并将元素返回
RPOP KEY
1.4 实例
列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。
4. Set(集合)
1)Redis的Set是string类型的无序集合。
2)集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
3)不允许重复元素
1.1 添加
SADD KEY VALUE
1.2 获取
获取集合中的全部元素
SMEMBERS KEY
1.3 删除
删除集合中的某个元素
SREM KEY VALUE
1.4实例
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
5. zset(sorted set:有序集合)
1)Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
2)不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
3)zset的成员是唯一的,但分数(score)却可以重复。
1.1 存储
添加元素到集合,元素在集合中存在则更新对应score
ZADD KEY SCORE VALUE
1.2 获取
1. 获取全部
ZRANGE KEY START END
2.获取全部包括score
ZRANGE KEY START END WITHSCORES
1.3 删除
ZREM KEY VALUE
1.4 示例
四. 常用命令
1. 命令
1)KEYS *:查询所有键
2)TYPE KEY:获取键对应的的value的类型
3)DEL KEY:删除指定的key value
2.示例
五. 持久化
1.概念
Redis是一个内存数据库,当redis服务器重启,或者电脑重启,数据会消失,我们可以将redis内存中的数据持久化保存到硬盘的文件中。
2.Redis持久化方案(机制)
1.1 RDB
1)默认方式,不需要进行配置,默认就使用这种机制
2)在一定的间隔时间中,检测key的变化情况,然后持久化数据
3)使用步骤
a. 编辑redis.windows.conf文件,找到以下部分
注释部分
在900秒(15分钟)后,如果最少有1个key发生改变则持久化一次
b. 重新启动redis服务器,并指定配置文件名称
1.2 AOF
1)日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据
2)使用步骤
a. 编辑redis.windows.conf文件,找到以下部分
no:表关闭AOF机制;yes表示开启AOF机制
六. Java客户端Jedis
1.概述
Jedis:一款java操作redis数据库的工具
2. 使用步骤
1.1 下载jedis的jar包
1.2 使用
a. 获取连接
Jedis jedis = new Jedis("127.0.0.1", 6379);
b. 操作
jedis.set("username","zhangsan");
c. 关闭连接
jedis.close();
1.3 示例
import redis.clients.jedis.Jedis;
public class RedisJava {
public static void main(String[] args) {
//连接本地的 Redis 服务
Jedis jedis = new Jedis("localhost",6379);
// 如果 Redis 服务设置了密码,需要下面这行,没有就不需要
// jedis.auth("123456");
System.out.println("连接成功");
//查看服务是否运行
System.out.println("服务正在运行: "+jedis.ping());
}
}
注意:若在运行中报以下错误信息
java.lang.NoClassDefFoundError: com/google/gson/Gson
解决方案,缺少json.jar包,点击下载,将其加载到自己的项目中
3. Redis Java String(字符串) 实例
import redis.clients.jedis.Jedis;
public class RedisStringJava {
public static void main(String[] args) {
///连接本地的 Redis 服务
Jedis jedis = new Jedis("localhost",6379);
//也可以使用空参构造Jedis jedis = new Jedis(); 默认值"localhost",6379端口
System.out.println("Connection to server sucessfully");
//设置 redis 字符串数据
jedis.set("usernaem", "zhangsan");
// 将Delete after 20 seconds:xixi键值存入redis,并且20秒后自动删除该键值对
jedis.setex("Delete after 20 seconds",20,"xixi");
//关闭连接
jedis.close();
}
}
4. Redis Java Hash(哈希) 实例
import redis.clients.jedis.Jedis;
import java.util.Map;
import java.util.Set;
public class RedisHashJava {
public static void main(String[] args) {
//连接本地的 Redis 服务
Jedis jedis = new Jedis("localhost",6379);
//也可以使用空参构造Jedis jedis = new Jedis(); 默认值"localhost",6379端口
System.out.println("Connection to server sucessfully");
//设置 redis hash数据
jedis.hset("user","name","zhangsan");
jedis.hset("user","age","19");
jedis.hset("user","gender","male");
//1.获取指定的FIELD对应的值
String name=jedis.hget("user","name");
System.out.println(name);
//2.获取全部的FIELD对应的值
Map<String, String> user = jedis.hgetAll("user");
Set<String> keySet = user.keySet();
for(String key:keySet){
String value=user.get(key);
System.out.println(key+":"+value);
}
//关闭连接
jedis.close();
}
}
//输出结果
zhangsan
name:zhangsan
gender:male
age:19
5. Redis Java List(列表) 实例
import redis.clients.jedis.Jedis;
import java.util.List;
public class RedisListJava {
public static void main(String[] args) {
//连接本地的 Redis 服务
Jedis jedis = new Jedis("localhost",6379);
//也可以使用空参构造Jedis jedis = new Jedis(); 默认值"localhost",6379端口
System.out.println("Connection to server sucessfully");
//设置 redis list数据
jedis.lpush("mylist","a","b");//从左边存
jedis.rpush("mylist","c");//从右边存
//范围获取
List<String> mylist=jedis.lrange("mylist",0,-1);
System.out.println(mylist);
//弹出
String left=jedis.lpop("mylist");
System.out.println(left);
String right=jedis.rpop("mylist");
System.out.println(right);
//范围获取
List<String> mylist2=jedis.lrange("mylist",0,-1);
System.out.println(mylist2);
//关闭连接
jedis.close();
}
}
//输出结果
Connection to server sucessfully
[b, a, c]
b
c
[a]
6. Redis Java set(集合) 实例
import redis.clients.jedis.Jedis;
import java.util.Set;
public class RedisSetJava {
public static void main(String[] args) {
//连接本地的 Redis 服务
Jedis jedis = new Jedis("localhost",6379);
//也可以使用空参构造Jedis jedis = new Jedis(); 默认值"localhost",6379端口
System.out.println("Connection to server sucessfully");
//设置 redis set数据
jedis.sadd("myset", "java", "php", "c++");
//获取
Set<String> myset = jedis.smembers("myset");
System.out.println(myset);
//关闭连接
jedis.close();
}
}
//输出结果
Connection to server sucessfully
[c++, java, php]
6. Redis Java zset(有序集合) 实例
import redis.clients.jedis.Jedis;
import java.util.List;
public class RedisSetJava {
public static void main(String[] args) {
//连接本地的 Redis 服务
Jedis jedis = new Jedis("localhost",6379);
//也可以使用空参构造Jedis jedis = new Jedis(); 默认值"localhost",6379端口
System.out.println("Connection to server sucessfully");
//设置 redis sortedset数据
jedis.zadd("mysortedset",12,"赵云");
jedis.zadd("mysortedset",20,"猴子");
jedis.zadd("mysortedset",4,"妲己");
//sortedset获取
List<String> mysortedset = jedis.zrange("mysortedset", 0, -1);
System.out.println(mysortedset);
//关闭连接
jedis.close();
}
}
Connection to server sucessfully
[妲己, 赵云, 猴子]
七. Jedis连接池:JedisPool
1.使用步骤
a. 创建JdisPool连接池对象
b. 调用getResource()方法获取Jedis连接
2. 示例
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisText {
public static void main(String[] args) {
//创建一个配置对象
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(50);//最大活动对象数
jedisPoolConfig.setMaxIdle(10);//最大能够保持idel状态的对象连接数
//创建Jedis连接池对象
JedisPool jedisPool = new JedisPool(jedisPoolConfig,"127.0.0.1",6379);
//获取连接
Jedis jedis = jedisPool.getResource();
//使用
jedis.set("xixi","haha");
//关闭,归还到连接池中
jedis.close();
}
}