Redis - Remote Dictionary Server
Redis官网:https://redis.io
Redis中文网:http://www.redis.cn
Redis所属公司:Pivotal(Spring所在的公司)
Redis源码地址:https://github.com/antirez/redis
1. NoSQL - Not Only SQL
MySQL、Oracle、DB2:关系型数据库
结构化数据
:使用关系型数据库表示和存储,表现形式就是二维行列结构;
NoSQL:存储非结构化和半结构化数据
非结构化数据
:没有固定存储结构,文件、图片、音视频等
半结构化数据
:可以认为是结构化数据的一种,只不过不是以二维行列形式存储,但是数据包含相关标记,比如JSON、xml;
1.1 NoSQL数据库类型
-
键值对数据库(Key-Value数据库)
代表数据库:Redis、Memcached
-
列式数据库
代表数据库:谷歌的BigTable、Apache的HBase
-
文档数据库
这种数据库存储半结构化数据:一般存储为json格式,这种数据库更接近关系型数据库;
代表数据库:
MongoDB
、ElasticSearch(ES)
-
图数据库
并不是存储图片,而是存储数据间关系;
适合做社交网络、关系图谱;
代表数据库:
Neo4J
、OrientDB
2. Redis概述
1、Redis是一个
键值对类型
的内存数据库;2、Redis支持字符串、哈希、列表、集合、有序集合等数据结构;
3、Redis具有内置的数据复制、回收、事务和不同级别的磁盘上的持久性;
4、Redis是纯内存操作,具备很高的读写性能;读的速度能达到110000次/s,写的速度能达到81000次/s;
5、Redis支持主从模式的数据备份,数据可扩展性高;
6、Redis支持集群;
2.1 Redis的使用场景
- 缓存:缓存一些常用数据、缓存Session会话等
- 排行榜
- 简单的消息队列
- 好友关系:点赞、好友推荐等
- …
3. Redis单机版安装
Redis官方只提供了linux的安装版本,不提供windows的安装版本,但是微软使用Redis源码编译了一个windows的版的Redis安装包;
Window64位下载地址:https://github.com/MicrosoftArchive/redis/releases
3.1 Windows安装Redis
- 解压redis安装文件
-
启动redis服务,双击redis-server.exe即可
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EvCrBTur-1603456273573)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\1588648093825.png)]
-
命令行方式启动redis服务
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9hRR6PtM-1603456273575)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\1588648513897.png)]
-
启动redis客户端
双击redis-cli.exe
3.2 Centos7安装单机版Redis5.0.4
-
安装Development Tools
yum groupinstall -y "Development Tools"
-
上传安装包
redis-5.0.4.tar.gz
到/opt
目录 -
解压
redis-5.0.4.tar.gz
到/opt
目录tar -zxf redis-5.0.4.tar.gz -C /opt
-
开始安装redis
[root@localhost opt]# mv redis-5.0.4 redis
[root@localhost opt]# cd redis
[root@localhost redis]# make
-
测试安装
[root@localhost redis]# cd src/
[root@localhost src]# make install
CC Makefile.dep
Hint: It's a good idea to run 'make test' ;)
INSTALL install
INSTALL install
INSTALL install
INSTALL install
INSTALL install
-
修改配置文件(
/opt/redis/redis.conf
)1、bind 127.0.0.1 注释这一行
2、protected-mode no (将保护模式修改为no)
3、daemonize yes (设置为守护进程,把no改为yes)
-
启动redis server
redis-server /opt/redis/redis.conf
-
启动redis-cli客户端
redis-cli [-h 127.0.0.1 -p 6379 -a 密码]
-h:host,连接主机,默认连接127.0.0.1
-p:port,redis服务器端口号,默认连接端口是6379
-a:auth,redis登录密码
-
停止redis服务
redis-cli shutdown
4. Redis的多数据库特点
Redis默认支持
16个数据库
,以一个从0开始的递增数字命名可以通过redis.conf中的
databases
配置[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3jYE0nZB-1603456273583)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\1588662282392.png)]
客户端连接Redis服务器后会自动选择0号数据库,可以通过
SELECT 数据库id
更换数据库,例如选择15号数据库[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7A1FwQhZ-1603456273587)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\1588662343202.png)]
Redis多数据库特点
- 不支持自定义数据库名称。
- 不支持为每个数据库设置访问密码。
- 多个数据库之间不是完全隔离的,FLUSHALL命令会清空所有数据库的数据。
- 多数据库不适用存储不同应用的数据。
- Redis集群不支持多数据库。
5. Redis常用的全局命令
-
keys *
:查看所有的键,支持通配符查询,如:keys name*
-
exists key
:测试是否存在指定的key,存在返回1,不存在返回0 -
ttl key
:查看key的剩余有效时间,-1
代表永不过期,-2
表示key已经过期 -
expire key seconds
:设置key的过期时间,单位是秒 -
del key
:删除某个key -
rename key newkey
:修改key的名称 -
flushall
:清空所有数据(会跨库清空数据) -
info [section]
:查看数据信息,info Server,info CPU、info Replication -
persist key
:取消key的过期时间
6. Redis的数据类型
6.1 string类型
string类型是redis中最基本的类型,并且是二进制的安全的,可以存储序列化的对象、二进制图片、一个简单的字符串、数值等。一个字符串类型的键允许存储的数据最大容量是512MB。
特别注意:mset
、mget
在集群环境下无法使用;
6.2 hash类型
hash是一个string类型的field和value的映射表。特别适合存储对象,将一个对象存储在hash类型中会占用更少的内存,而且可以方便的操作对象。
6.3 list类型
list是一个链表结构,类似JDK的LinkedList、Queue,主要功能是push、pop、获取一个范围的所有值等等,key可以认为链表的名称。list类型的每个子元素都是string类型的双向链表,可以通过push、pop从链表的头部或者尾部添加、删除元素;
6.4 set类型
set是string类型的无序不可重复的集合。Set是通过hash table实现的,添加、删除和查找的复杂度都是o(1)。我们可以对set取并集、交集、差集
。通过set的这些操作我们可以实现好友推荐功能。
6.5 zset类型
zset有序集合,类似SortedSet。
7. 使用Jedis连接Redis服务器
-
jedis的源码地址
https://github.com/xetorthio/jedis
-
maven依赖
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.2.0</version> </dependency>
-
api
JedisPoolConfig:连接池配置(连接池大小等)
JedisPool:连接池(保存Jedis实例)
Jedis:从连接池获取的实例,用于操作Redis
-
单机版Demo
StandaloneUtil
/**
* jedisPoolConfig
* jedisPool
* Jedis
*/
public class StandaloneUtil {
private StandaloneUtil(){
}
//最大连接数
private static final int MAX_TOTAL = 5;
//最大空闲数
private static final int MAX_IDLE = 5;
//最小空闲数
private static final int MIN_IDLE = 1;
//主机号 端口号
private static final String HOST = "192.168.233.128";
private static final int PORT = 6379;
private static final JedisPoolConfig poolConfig = new JedisPoolConfig();
private static final JedisPool jedisPool;
static {
poolConfig.setMaxTotal(MAX_TOTAL);
poolConfig.setMaxIdle(MAX_IDLE);
poolConfig.setMinIdle(MIN_IDLE);
jedisPool = new JedisPool(poolConfig,HOST,PORT);
}
private static final ThreadLocal<Jedis> threadLocal = new ThreadLocal<>();
//获取实例对象
public static Jedis getInstance(){
Jedis jedis = threadLocal.get();
if(jedis==null){
jedis = jedisPool.getResource();
threadLocal.set(jedis);
}
return jedis;
}
public static void close(){
Jedis jedis = threadLocal.get();
if(jedis != null){
//关闭自动回到线程池
jedis.close();
threadLocal.remove();
}
}
}
StandaloneTest
public class StandaloneTest {
public static void main(String[] args) {
//officalDemo();
Jedis instance1 = StandaloneUtil2.getInstance();
Jedis instance2 = StandaloneUtil2.getInstance();
Jedis instance3 = StandaloneUtil2.getInstance();
Jedis instance4 = StandaloneUtil2.getInstance();
System.out.println(instance1);
System.out.println(instance2);
System.out.println(instance3);
System.out.println(instance4);
}
public static void officalDemo(){
//创建jedis实例 默认链接6379端口号
Jedis jedis = new Jedis("192.168.233.128",6379);
//使用jedis实例操作redis数据库
jedis.set("foo","bar");
String value = jedis.get("foo");
System.out.println(value);
}
public static void demo1(){
Jedis jedis = StandaloneUtil.getInstance();
jedis.hset("user","name","zs");
jedis.hset("user","id","1");
Set <String> hkeys = jedis.hkeys("user");
hkeys.forEach(System.out::println);
StandaloneUtil.close();
}
}
8. Jedis整合spring
-
maven依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.6.RELEASE</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.2.0</version> </dependency>
-
配置spring bean
JedisPoolConfig
JedisPool
@Configuration public class StandaloneConfig { @Bean public LikeService likeService(){ return new LikeService(); } @Bean public JedisPoolConfig poolConfig(){ JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMinIdle(1); poolConfig.setMaxIdle(30); poolConfig.setMaxTotal(30