Redis简介
-
概述
NoSQL:
SQL关系型数据库:MySQL 0racle
NoSQL非关系型数据库:Redis Memcached...
No(Not Only)不仅仅关系型数据库,对关系型数据库的补充
学习NoSQL数据库时,不是为了取代关系型数据库
特点:
Key-Value存储系统
Value类型:(面试题)
String(字符串)、
list(链表)、
set(集合)、
zset(sorted set----有序集合)、
hash(哈希类型)
支持各种方式的排序(使用比较方便)
为了保证效率,数据都是缓存在内存中
C语言开发,提供了Java、C/C++、C#、PHP、JavaScript、Perl、Object-C、Python、Rudy、Erlang等客户端,使用很方便
- 应用场景
缓存(数据查询 短链接 新闻内容)
任务队列
排行榜
访问统计
-
Redis安装配置
第一步:安装Redis编译的C环境
默认情况下CentOS系统中并没有安装C环境
安装命令:
yum install gcc-c++
安装过程中出现提示:
输入y确认即可
第二步:上传文件压缩包到Linux系统中
上传目录:/usr/local
借助远程工具直接上传即可
第三步:解压压缩包
安装目录:/usr/local
进入安装目录:
执行解压命令:
tar -xvf redis-5.0.4.tar.gz
第四步:编译
进入解压目录:
cd redis-5.0.4
执行make命令编译
make
第五步:安装
安装命令:
make PREFIX=/usr/local/redis install
cd src && make test
make[1]: Entering directory `/usr/local/redis-5.0.4/src'
You need tcl 8.5 or newer in order to run the Redis test
make[1]: *** [test] 错误 1
make[1]: Leaving directory `/usr/local/redis-5.0.4/src'
make: *** [test] 错误 2
原因:jemallloc 重载了Linux下的ANSI C中的malloc 和free函数
删除解压缩文件夹
重新执行编译命令(带参数)
make MALLOC=libc
安装命令:make PREFIX=/usr/local/redis install
第六步:测试运行
复制解压文件redis-5.0.4中的redis的配置文件redis.conf到安装目录redis中的bin目录下
启动redis。进入redis中的bin目录下,执行命令:
./redis-server redis.conf
出现下图,表示启动成功
上述方式启动,一旦关闭当前窗口,redis服务停止了
第七步:后台启动(建议使用)
修改配置文件:136行
进入bin目录,重新执行启动命令
./redis-server redis.conf
出现下图
- Redis其他配置
- 允许远程访问(69行)
- 密码设置(507/508)
注意:配置修改完成,建议重启
- 远程连接
远程连接命令
./redis-cli -a 123456 -p 6379
第一步:安装远程连接客户端
安装过程,下一步即可,可以自定义安装目录
第二步:输入内容测试连接
填写为自己的内容,测试连接(测试连接之前停用防火墙)
第三步:连接
测试成功直接连接即可
如果工具不可用,使用命令行连接即可
命令行失败:
密码设置没有生效
检查自己的配置文件
- Redis常用命令
- 启动Redis命令
Redis启动
进入Redis安装目录bin目录,执行命令:
./redis-server
指定配置文件方式启动(后台启动)
进入Redis安装目录bin目录,执行命令:
./redis-server redis.conf
- 客户端连接
指定密码和端口号
进入Redis安装目录bin目录,执行命令:
./redis-cli -a 123456 -p 6379
使用ping指令测试与主机的连接状态是否存在异常
- 其他命令
关闭、退出、重启
SHUTDOWN:关闭连接(杀死服务),慎重使用
Exit:退出命令(常用)
Quit:退出命令(常用)
//systemctl restart redis(当前系统中不一定生效),开发中可能需要使用
DBSIZE:数据库中key的数量
FLUSHDB:删除当前数据库中所有的key
FLUSHALL:删除所有库的信息
注意:Redis中默认有16个库
SELECT 数据库下标:切换数据库
注意:下标值从0开始,到15结束,如果当前数据库为0库时,不显示下标
Info:查看当前数据库的信息
- key关键字指令
常用指令:key
keys *:查看当前数据库中所有的key
EXISTS key名称:判断当前的key是否存在,存在返回1,不存在0
注意:key值不重复的,如果指定key的value值时,当前的key已经存在有值,覆盖
move key的名称 数据库的下标:移动当前的key到指定下标的数据库中
EXPIRE key的名称 时间(秒):设置key的过期时间
ttl key的名称:查看当前key的过期时间
注意:-2表示已经过期,-1表示永不过期
TYPE key的名称:返回当前key的数据类型(String,Object)
- String类型数据指令
set key的名称 value值:设置key-value一组值(单一键值对,key值重复,覆盖原value)
get key的名称 :获取指定key的value
del key的名称(可以是多个):删除指定key的值
APPEND key的名称 新值:给指定的key追加新值
STRLEN key的名称:获取指定key的值的长度
截取:
GETRANGE key的名称 起始下标 终点下标:截取范围内的字符串
GETRANGE key的名称 0 -1:截取全部(比较常用)
替换:
SETRANGE key的名称 起始下标 替换值:从指定位置开始替换相应的内容
设置key值:
SETEX key的名称 存活时间 value值:设置一个值同时指定存活时间
SETNX key的名称 value值:设置一个值同时永不过期(与set key的区别在于,当key值重复时,setnx返回0,不修改,set直接去修改原有值)
mset key vakue...:同时设置一组key-value...,永不过期
mget key1 key2 keyn:一次性获取多个值,值不存在返回(nil),表示空值
MSETNX key value....:一次性设置多组key-value,key值存在返回0,执行失败
(key的value值必须为数字)
INCR key的名称:自增(value的值自动加1)
DECR key的名称:自减(value的值自动减1)
INCRBY key的名称 步长:自增(value的值自动加指定的步长)
DECRBY key的名称 步长:自减(value的值自动减指定的步长)
- List类型指令(添加、删除)
LPUSH key values(多个值):创建集合设置一组值
注意:使用lpush指令向集合中添加元素时,添加顺序与显示顺序相反
RPUSH key values(多个值):创建集合设置一组值
注意:使用RPUSH 指令向集合中添加元素时,添加顺序与显示顺序相同
LRANGE key 起始下标 结束下标:获取集合元素
LLEN key:获取指定集合的长度
LPOP key:移除集合中的第一个元素
RPOP key:移除集合中的最后一个元素
LINDEX key 下标:获取集合中指定下标的元素
LREM key count value:删除指定个数(count)的值(value)在指定的的集合(key)中
注意:list集合中元素是可以重复的
- Set集合
SADD key 元素:向集合中添加元素,set集合无序,元素不可重复
SMEMBERS key:查看集合中元素
SCARD key:返回集合长度
SREM key 元素:删除集合中指定的元素
SPOP key 元素个数:随机删除集合中指定个数的元素
SMOVE key1 key2 元素:将某一个集合中的元素移动到另一个集合,如果说集合(目标key2)不存在,会创建集合接收移动过来的元素
SDIFF 差集
SINTER 交集
SUNION 并集
- Hash(哈希)(key---value(key value...))
HSET key filed value :添加一组键值对 指定对象(key)的指定属性(filed)设置值(value)
HGET key field :获取对象的属性值
HMSET key field1 value1... :同时为一个对象指定多个属性值
HMGET key field...:同时获取对象的多个属性值
HGETALL key:获取对象的全部属性及值
HDEL key field...:删除对象的属性(一个或多个)
HLEN key:返回对象的属性个数
HEXISTS key field:判断当前key中是否有指定名称(field)的键值对
HKEYS key:获取对象的全部属性
HVALS key:获取对象全部属性的值
HINCRBY key field 值:为当前的数字属性增加值(可以是负数,表示减少)
HINCRBYFLOAT key field 值:为当前的数字属性增加值(小数)
HSETNX key field value:添加值(同hset),重复元素不覆盖
- Zset
有序集合,是String类型的有序集合,也不可重复
Zset中有一个分数的概念,每一个元素都有自己的分数,zset根据分数对元素进行排序
英雄联盟:rank分
1000分 青铜
1200分 白银
1500分 黄金
1700分 铂金
1800分 钻石
2000分 王者
隐藏分高
腾讯会员:
500 vip1
1000 vip2
1500 vip3
......
ZADD vips 500 v1 1000 v2 1500 v3 2000 v4:添加有序集合
ZRANGE vips 0 -1:查询所有value
ZRANGE vips 0 -1 withscores:查询结果带着分数
ZRANGEBYSCORE vips 500 1500:根据分数查询
根据分数查询,显示分数
ZREM vips v4:删除元素v4
ZCARD vips:统计元素个数
ZCOUNT vips 500 2000:统计分数区间的元素的个数
ZRANK vips v2:统计元素的下标,如果元素不存在返回空值
ZSCORE vips v3:查看元素的分数
- Java操作Redis(重要)
Redis不仅是使用命令来操作,基本上主流编程语言都有自己的客户端(操作Redis的API)
Java客户端:Jedis 、Redisson、 Jredis、 JDBC-Redis...
官网上推荐使用Jedis和Redisson
企业中使用的比较多的是Jedis
学习使用的就是Jedis
1、使用Jedis准备工作
连接失败:
远程连接配置:ip 0.0.0.0
防火墙关闭,放行6379 service iptables start
设置密码(必须设置)
2、开发步骤(单实例连接)
第一步:创建工程,添加依赖
依赖包:
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
第二步:创建连接,访问Redis(单实例连接)
以上方式为单实例连接(每次需要创建一个连接对象jedis)
// 创建Jedis对象,指定远程访问的IP与端口号
Jedis jedis = new Jedis("192.168.184.129",6379);
// 认证:指定密码
jedis.auth("123456");
// 使用jedis对象操作Redis
jedis.set("jedisDemo","Hello jedis!!!!");
System.out.println(jedis.get("a"));
// 关闭连接,释放资源
jedis.close();
注意:Jedis对象操作Redis内容时,方法的名称基本与之前的常见命令保持一致
3、使用连接池连接Redis
public static void main(String[] args) {
// 1.创建连接池对象
JedisPool jedisPool = new JedisPool("192.168.184.129",6379);
// 2.从池子中获取Jedis对象
Jedis jedis = jedisPool.getResource();
// 3.认证:密码
jedis.auth("123456");
// 4.数据操作
System.out.println(jedis.get("a"));
// 5.关闭连接
jedis.close();
// 6.关闭连接池
jedisPool.close();
}
常见错误:
- Redis存储Java对象(序列化操作)
定义序列化工具类
public class SerializeUtil {
// 序列化
// 将Java对象转换成字节数组
// 将Java对象信息写入字节数组 OutputStream
public static byte[] serialeze(Object object){
// 对象输出流 将对象信息写入ByteArrayOutputStream
ObjectOutputStream oos = null;
// 存储对象信息
ByteArrayOutputStream baos = null;
byte[] bytes = null;
try {
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
// 对象信息写入过程
oos.writeObject(object);
// 完成对象信息到字节数组的转换
bytes = baos.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}
return bytes;
}
序列化过程:
// 反序列化 字节数组中的数据读出来,存储到对象中
public static Object deserialeze(byte[] bytes) throws IOException, ClassNotFoundException {
ByteArrayInputStream bais = null;
ObjectInputStream ois = null;
try {
bais = new ByteArrayInputStream(bytes);
ois = new ObjectInputStream(bais);
} catch (IOException e) {
e.printStackTrace();
}
return ois.readObject();
}
使用工具类方法存取对象
存:jedis.set("p3".getBytes(),SerializeUtil.serialeze(person));
取:Person person = (Person) SerializeUtil.deserialeze(jedis.get("p3".getBytes()));
- Redis存储Java对象(Json格式存储)
Google:Gson
阿里巴巴:FastJson
存:将Java对象转换成Json数据,存储到Redis中
取:将Json数据取出,转换成Java对象
使用步骤
第一步:导入第三方Jar包(Gson\FastJson)
<!-- gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.68</version>
</dependency>
第二步:存取数据(Java对象与Json串相互转换)
使用Gson
//使用Gson将对象转换成Json串
Gson gson = new Gson();
String perJson = gson.toJson(person);
//使用Gson对象将json串转成Java对象
Person person1 = gson.fromJson(json,Person.class);
使用FastJson
//使用FastJson将Java对象转换成Json串
String Json = JSON.toJSONString(person);
//使用FastJson将Json串转成Java对象
Person person = JSON.parseObject(Json,Person.class);
补充知识点(了解):GsonFomat插件使用
功能:给定Json串可以自动生成Java实体类
- 安装插件
- 重启Idea
- 使用
创建实体类
在类中使用快捷键:ALT+insert
复制json串到窗口中
点击ok自动生成实体类中的内容
- Spring整合Jedis
- Spring整合Jedis原理
Spring整合过JDBC
Spring整合过MyBatis
Spring整合Jedis
“Spring整合什么什么内容”,意思就是将什么什么对象交给Spring容器管理
Jedis对象是操作Redis的核心对象
Jedis对象可以从连接池中获取
向Spring容器中添加一个连接池对象:JedisPool
创建Jedis 容器.getBean(pool).getResources()
- 整合步骤
第一步:创建项目,导入相关依赖
<properties>
<spring.version>5.1.3.RELEASE</spring.version>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>Redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
第二步:创建Spring核心配置文件,容器中配置连接池
<!--连接池配置对象-->
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 最大连接数 -->
<property name="maxTotal" value="10"/>
<!-- 空闲连接数 -->
<property name="maxIdle" value="2"/>
<!-- 设置链接池的连接耗尽时,是否等待 -->
<property name="blockWhenExhausted" value="true"/>
<!-- 最大等待时间 -->
<property name="maxWaitMillis" value="30000"/>
<!-- 获取到连接时,是否检查链接的有效性 -->
<property name="testOnBorrow" value="true"/>
</bean>
<!--注入连接池对象:构造函数方式注入 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<!-- 池的属性 -->
<constructor-arg name="poolConfig" ref="poolConfig"/>
<!-- Redis主机地址 -->
<constructor-arg name="host" value="192.168.184.129"/>
<!-- Redis主机端口 -->
<constructor-arg name="port" value="6379"/>
<!-- Redis密码 -->
<constructor-arg name="password" value="123456"/>
<!-- 可以选择Redis数据库(要选择数据库,必须开启了密码) -->
<constructor-arg name="database" value="0"/>
<!-- 链接超时时间 -->
<constructor-arg name="timeout" value="30000"/>
</bean>
注意:
Redis安装完成允许远程连接,必须设置密码
Spring整合JedisPool(连接池)时,使用的构造函数注入,编写时务必注意属性名称
个数
第三步:编写测试类
public static void main(String[] args) {
//创建容器
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-jedis.xml");
//获取连接池对象
JedisPool jedisPool = (JedisPool) applicationContext.getBean("jedisPool");
//创建Jedis对象
Jedis jedis = jedisPool.getResource();
//数据操作
System.out.println(jedis.get("a"));
}