Redis的简单使用及介绍
文章目录
一、缓存
缓冲的功能,就是提高性能减少与数据库的交互
1.缓存的思想
- 当用户第一次查询的时候取查询数据库,查询到的内容,一方面返回给页面,另一方面最缓存(存在容器中)
- 当用户第二期查询的时候,此时缓存中就有了数据,此时就不用查询数据库就可以拿到数据了
- 当增删改数据库信息时,把缓存清空
核心流程 - 用户访问,先看缓存中有没有
- 如果有则直接拿出返回给页面
- 如果没有则查询数据库,把查询出的内容放到缓存中
2.缓存的弊端
做到数据的实时性比较麻烦,需要在增删改的时候清空数据
二、Nosql数据库
1.什么是Nosql数据库
Nosql,叫非关系型数据库,它的全名叫Not only sql。是针对关系型数据库来说的
2.Nosql数据库的分类
3.Nosql的好处
为了解决高并发、高可用、高可扩展,大数据储存等一系列问题而产生的的数据库解决方案
4.Nosql和关系型数据库的区别
-
区别一
关系型数据库是需要依赖数据库的关系的,比如说主外键,数据储存在硬盘上
非关系型数据库依赖特殊结果,比如redis是key-value的数据格式,数据存在内存中,可持久化 -
区别二
关系型数据库有主外键关系
非关系型数据库没有这个概念 -
区别三
关系型数据库:操作的是硬盘,效率低,安全性稍微高
非关系型数据库(redis)操作的是内存,效率高,但是不安全,数据可能丢失
三、Redis
1.什么是redis
**Redis是使用c语言开发的一个高性能键值Nosql数据库,Redis可以通过一些键值类型来存储数据 **
2.Redis的特点
- 高性能,持久存储,适应高并发的应用场景
- 相比许多键值数据存储,Redis拥有一套较为丰富的数据类型
- Redis数据库完全在内存中,使用磁盘仅用于持久性
- Redis可以将数据复制到任意数量的从服务器
3.Redis的有事
- 异常快速:Redis的速度非常快,支持丰富的数据类型。读的速度是110000次/s,写的速度是81000次/s
- 操作都是原子性:所有Redis操作都是原子的,这保证了如果两个客户端同时访问Redis服务器将获得更新后的值
4.Redis的作用
- 缓存
- 存临时数据
5.Redis的文件介绍
6.Redis的启动
7.客户端连接
四、Redis的Value的取值
注意:Redis存的是key-value,但是key只能是字符串,value的取值有如下几种类型
- 字符串(String)
- 散列(Hash)
- 列表(List)
- 集合(Set)
- 有序集合(SortedSet)
1.List&Set&SortedSet区别
- List类型:有顺序 可以重复
- Set类型:没有顺序 不能重复
- SortedSet类型:有顺序 不能重复
2.String类型的操作
存取单个数据
- 存值
set key value - 取值
get key
存取多个数据
- 存值
mset key value key1 value1 - 取值
mget key key2
删除数据
del key
3.hash类型操作
存取单个属性值
- 存值
hset key field fieldValue - 取值
hget key field
存取多个属性值
- 存值
hmset key field1 field1Value field2 field2Value - 取值
hmget key field1 field2
删除属性值
- 语法
hdel key field1 field2
4.list类型操作
有顺序可重复
右压栈和左弹栈
右压栈 是指数据从头添加,数据春旭往后排,类似数据向右压
左弹栈 是指数据从左边弹出
- 右压栈
lpush key value1 value2 value3 - 左弹栈
lpop key (从左边弹出第一个)
左压栈和右弹栈
左压栈:表示数据从后添加
右弹栈:表示数据从后弹出
- 左压栈
rpush key value1 value2 value3 - 右弹栈
rpop key (从右边弹出一个)
查看数据
- 语法
lrange key startIdex endIndex
注意:当endIndex=-1时,表示查询所有
5.Set类型操作
不可重复没有顺序
存取数据
- 存数据
sadd key value1 value2 value3 - 取数据
smembers key
删除数据
- 语法
srem key value
6.SortedSet类型
有序,不能重复
注意:每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序。
存取数据
- 存值
zadd key score1 value1 score2 value2 - 取值
zrange key startIdex endIdex
当endIdex等于-1时,表示查询所有
删除数据
- 语法
zrem key value
7.Redis的通用指令
key* 获得所有的key
key list* 获得以list开头的key
五、Redis的持久化
redis是把市局存在内存中的,如果我们的服务器关机,这个时候内存中的数据将不存在,所以要做持久化
当服务器再次启动的时候,Redis就会把本地数据加载到内存中
1.RDB的方式
这种持久化方式是磨人的,不用任何配置
- 规则
- 持久化文件
AOF的方式
每一次操作或者每一秒,都会吧记录持久化到硬盘中(费资源),是每次还是每秒取决于配置
- 开启方式
六、java操作Redis
- Jedis的方式
- SpringDataRedis的方式
1.Jedis单独的方式
- 导入jar
commons-pool2-2.3.jar
jedis-2.7.0.jar
- 对String的操作
- 对hash的操作
- 对List的操作
- 对set的操作
- 对sortedSet的操作
2.Jedis连接池的方式
/**
* 连接池的使用
*/
// @Test
public void pool() {
JedisPoolConfig config = new JedisPoolConfig();
// 最大空闲数
config.setMaxIdle(10);
// 最大连接数
config.setMaxTotal(50);
//通过配置类创建连接池
JedisPool pool = new JedisPool(config,"localhost",6379);
// 在连接池中取出Jedis连接
Jedis jedis = pool.getResource();
jedis.set("haha","窗前明月光");
String haha = jedis.get("haha");
System.out.println(haha);
}
3.连接池的封装
- 第一步:新建一个jedis.properties文件
host=localhost
port=6379
maxIdle=10
maxTotal=50
- 第二步:编写工具类
public class JedisUtil {
private static JedisPool jedisPool;
static {
InputStream in = JedisUtil.class.getClassLoader().getResourceAsStream("redis.properties");
Properties properties = new Properties();
try {
properties.load(in);
JedisPoolConfig config = new JedisPoolConfig();
// 最大空闲数
config.setMaxIdle(Integer.parseInt(properties.getProperty("maxIdle")));
// 最大连接数
config.setMaxTotal(Integer.parseInt(properties.getProperty("maxTotal")));
jedisPool = new JedisPool(config, properties.getProperty("host"), Integer.parseInt(properties.getProperty("port")));
} catch (IOException e) {
throw new RuntimeException("配置文件加载失败");
}
}
/**
* 这个是获得Jedis
*
* @return
*/
public static Jedis getJedis() {
return jedisPool.getResource();
}
/**
* 释放资源
*/
public static void release(Jedis jedis) {
//这个表示当前jedis链接 放到我们链接池中 并不是关闭了
jedis.close();
}
}
七、集群的搭建
- 复制一份配置文件
- 修改复制的配置文件
- 根据不同的配置文件分别启动2次
Jedis对集群的操作
@Test
public void fun() {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(50);
config.setMaxIdle(10);
JedisShardInfo info1 = new JedisShardInfo("localhost", 6379);
JedisShardInfo info2 = new JedisShardInfo("localhost", 7777);
List<JedisShardInfo> list = new ArrayList<>();
list.add(info1);
list.add(info2);
ShardedJedisPool pool = new ShardedJedisPool(config, list);
ShardedJedis jedis = pool.getResource();
for (int i = 0; i <100; i++) {
jedis.set("name"+i,"huige"+i);
}
jedis.close();
}
}