Redis
一、Redis概述
官网:https://redis.io
1.概念
Redis是用C语言开发的一个开源的高性能基于内存运行的键值对NoSQL数据库
关系型数据库:mysql、oracle...
非关系型数据库(NOSQL
):redis、hbase...
2.特征
(1) 支持数据的持久化,可以将数据保存在磁盘中,重启之后可以再次加载到内存中使用
(2) 支持多种数据类型,除了KV类型的数据,还支持list、set、hash等数据结构
(3) 支持master-slave模式的数据备份
NOSQL
1.什么是NOSQL
NoSQL(NoSQL = Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。
随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
2.NOSQL和关系型数据库比较
优点:
1)成本:nosql数据库简单易部署,基本都是开源软件,不需要像使用oracle那样花费大量成本购买使用,相比关系型数据库价格便宜。
2)查询速度:nosql数据库将数据存储于缓存之中,关系型数据库将数据存储在硬盘中,自然查询速度远不及nosql数据库。
3)存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,所以可以存储基础类型以及对象或者是集合等各种格式,而数据库则只支持基础类型。
4)扩展性:关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难。
缺点:
1)维护的工具和资料有限,因为nosql是属于新的技术,不能和关系型数据库10几年的技术同日而语。
2)不提供对sql的支持,如果不支持sql这样的工业标准,将产生一定用户的学习和使用成本。
3)不提供关系型数据库对事务的处理。
3.非关系型数据库的优势:
1)性能NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高。
2)可扩展性同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。
4.关系型数据库的优势:
1)复杂查询可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。
2)事务支持使得对于安全性能很高的数据访问要求得以实现。对于这两类数据库,对方的优势就是自己的弱势,反之亦然。
5.总结
关系型数据库与NoSQL数据库并非对立而是互补的关系,即通常情况下使用关系型数据库,在适合使用NoSQL的时候使用NoSQL数据库,
让NoSQL数据库对关系型数据库的不足进行弥补。
一般会将数据存储在关系型数据库中,在nosql数据库中备份存储关系型数据库的数据
二、Redis应用场景
热点数据加速查询(主要场景),如热点商品、热点信息等访问量较高的数据
即时信息查询,如公交到站信息、在线人数信息等
时效性信息控制,如验证码控制、投票控制等
分布式数据共享,如分布式集群架构中的session分离消息队列
三、Redis基础知识
Redis采用单线程机制进行工作
Redis默认拥有16个数据库,数据库编号从0开始,默认使用0号数据库
使用select 数据库编号 可以切换使用的数据库
dbsize 命令查看当前数据库key的数量
keys * 命令查看当前数据库所有的key
flushdb 命令清空当前数据库
flushall 命令清空所有数据库
Redis中所有数据库使用同一个密码,默认没有密码,Redis认为安全层面应该由Linux来保证
Redis中所有索引都是从0开始
Redis默认端口是6379
四、redis的数据结构
redis存储的是:key,value格式的数据,其中key都是字符串,value有5种不同的数据结构
value的数据结构:
字符串类型 string
哈希类型 hash --> map格式
列表类型 list --> linkedlist格式
集合类型 set
有序集合类型 sortedset
1.字符串类型String
1.存储:set key value
2.取值:get key value
3.删除:del key
2.哈希类型hash
1.存储:hset key field value
2.获取:
hget key field:获取指定的field对应的值
hgetall key:获取所有的field和value
3.删除:hdel key field
3.列表类型list
1.概念:可以添加一个元素到列表的头部(左边)或者尾部(右边)。
2.添加:
1.lpush key value:将元素加入列表左边
2.rpush key vakue:将元素加入列表右边
3.获取:
lrange key start end:范围获取
4.删除:
lpop key:删除列表最左边的元素,将元素返回
rpop key:删除列表最右边的元素,将元素返回
4.集合类型set
1.存储:sadd key value
2.获取:smembers key
:获取set
集合中所有元素
3.删除:srem key value
:删除set
集合中的某个元素
5.有序集合类型zsets
有序集合中的每个元素都关联一个序号(score),这便是排序的依据。
- 1.概念:不允许重复元素,且元素有顺序
- 2.存储:
zadd key score value
: - 3.获取:
zrange key start end
- 4.删除:
zren key value
6.通用命令
1.keys *
:查询所有的键(这里的 * 是正则表达式 匹配所有)
2.type key
:获取键对应的value
类型
3.del key
:删除指定的key value
五、持久化操作
1.redis是一个内存数据库,当redis服务器重启,获取电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中。
2.redis持久化机制:
1.RDB:默认方式,不需要进行配置,默认就使用这种机制(对性能影响小)
在一定的间隔时间中,检测key的变化情况,然后持久化数据
1.1.编辑redis.windows.conf文件
save 900 1 :在十五分钟之后有一个 key 发生改变就会执行一次持久化操作。
save 300 10:在五分钟之后至少有十个 key 发生改变就会执行一次持久化操作。
save 60 10000:在一分钟之后至少有一万个 key 发生改变就会执行一次持久化操作。
1.2.重新启动redis服务器,并指定配置文件名称:
在文件目录下:redis-server.exe redis.windows.conf
2.AOF: 日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据
2.1.编辑redis.windows.conf文件
appendonly no(关闭 AOF) --> appendonly yes(开启 AOF)
appendfsync always:每一次操作都进行持久化
appendsync everysec:每隔一秒进行一次持久化(默认)
appendsync no:不进行持久化
六、SpringBoot中使用Redis
1、添加依赖
<!-- redis依赖包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
3.2 配置Redis数据库连接
在application.properties中配置redis数据库连接信息
#redis配置
#Redis服务器地址
spring.redis.host=127.0.0.1
#Redis服务器连接端口
spring.redis.port=6379
#Redis数据库索引(默认为0)
spring.redis.database=0
#连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=50
#连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=3000
#连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=20
#连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=2
#连接超时时间(毫秒)
spring.redis.timeout=5000
3.3 编写Redis操作工具类
将RedisTemplate实例包装成一个工具类,便于对redis进行数据操作。
package com.xcbeyond.springboot.redis;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
@Component
public class RedisUtils {
@Autowired
private RedisTemplate<String, String> redisTemplate;
/**
* 读取缓存
*
* @param key
* @return
*/
public String get(final String key) {
return redisTemplate.opsForValue().get(key);
}
/**
* 写入缓存
*/
public boolean set(final String key, String value) {
boolean result = false;
try {
redisTemplate.opsForValue().set(key, value);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 更新缓存
*/
public boolean getAndSet(final String key, String value) {
boolean result = false;
try {
redisTemplate.opsForValue().getAndSet(key, value);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 删除缓存
*/
public boolean delete(final String key) {
boolean result = false;
try {
redisTemplate.delete(key);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
3.4 测试
写一个测试用例类来完成对redis的读写。
package com.xcbeyond.springboot.redis;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class RedisTest {
@Resource
private RedisUtils redisUtils;
/**
* 插入缓存数据
*/
@Test
public void set() {
redisUtils.set("redis_key", "redis_vale");
}
/**
* 读取缓存数据
*/
@Test
public void get() {
String value = redisUtils.get("redis_key");
System.out.println(value);
}
}