文章目录
Redis
1.什么是NoSQL
NoSQL是Not Only SQL的缩写,意即"不仅仅是SQL"的意思.泛指非关系型的数据库.强调Key-Value Stores和文件数据库的优点
2.Redis简介
Redis:Remote Dictionary Server(远程字典服务器)
Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库。Redis全称为:Remote Dictionary Server(远程数据服务),该软件使用C语言编写,Redis是一个key-value存储系统,它支持丰富的数据类型,如:string、list、set、zset(sorted set)、hash。
Redis的特点
1.Redis读取的速度是110000次/s,写的速度是81000次/s
2.原子.Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行.
3.支持多种数据结构:String(字符串),list(列表),hash(哈希),set(集合),zset(有序集合)
4.持久化,主从复制(集群)
5.支持过期时间,支持事务,消息订阅.
6.官方不支持window,但是有第三方版本.
Redis的应用场景
1.数据缓存(提高访问性能)
将一些数据在短时间之内不会发生变化,而且它们还要被频繁访问,为了提高用户的请求速度和降低网站的负载,降低数据库的读写次数,就把这些数据放到缓存中
2.会话缓存
(session,cache,保存web会话信息)
3.排行榜/计算器
(Nginx+lua+redis 计数器进行IP自动封禁)
4.消息队列
(构建实时消息系统,聊天,群聊)
Redis的安装即启停
-
1.下载Redis5
进入Redis官网下载https://redis.io/download
-
2.打开VM虚拟机把文件copy到software里面
-
3.开始安装
-
1.安装gcc 目的是编译软件
yum install gcc-c++
-
2.解压
tar -zxvf redis-5.0.9.tar-gz
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WBTMv1H4-1603532821375)(E:%5CY2%5CTypora%E7%AC%94%E8%AE%B0%5CSSM%E6%A1%86%E6%9E%B6%5Credis%E5%9B%BE%E7%89%87%5C%E8%A7%A3%E5%8E%8B%E5%90%8E%E7%9A%84redis%E6%96%87%E4%BB%B6.png)]
-
3.把解压的文件copy到/usr/local/src里面
cp -r /root/software/redis-5.0.9 /usr/local/src/redis
-
4.打开/usr/local/src/redis/deps进行编译依赖项
cd /usr/local/src/redis/deps make hiredis lua jemalloc linenoise
-
5.打开/usr/local/src/redis进行编译
cd /usr/local/src/redis make
-
6.在上面的Redis目录安装把它安装到/usr/local/redis里面
mkdir /usr/local/redis make install PREFIX=/usr/local/redis
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i79m6pZ3-1603532821384)(E:%5CY2%5CTypora%E7%AC%94%E8%AE%B0%5CSSM%E6%A1%86%E6%9E%B6%5Credis%E5%9B%BE%E7%89%87%5C%E5%AE%89%E8%A3%85%E6%88%90%E5%8A%9F.png)]
看到上面的说明安装成功了
-
7.验证安装是否成
cd /usr/local/redis/bin ll
看到如下启动文件就可以了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NWazmwr7-1603532821385)(E:%5CY2%5CTypora%E7%AC%94%E8%AE%B0%5CSSM%E6%A1%86%E6%9E%B6%5Credis%E5%9B%BE%E7%89%87%5Cbin%E7%9B%AE%E5%BD%95%E4%B8%8B%E7%9A%84%E6%96%87%E4%BB%B6.png)]
-
8.把配置文件移动到/root/myredis目录[目录可以自定义]可以为/root/myredis
mkdir /root/myredis cp /usr/local/src/redis/redis.conf /root/myredis
-
9.启动redis 使用其他配置文件启动redis
redis-server /root/myredis/redis.conf
-
10.默认情况,redis不是后台运行,我们需要设置配置文件把它变成后台运行
vi /usr/myredis/redis.conf
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VVjBjDZs-1603532821387)(E:%5CY2%5CTypora%E7%AC%94%E8%AE%B0%5CSSM%E6%A1%86%E6%9E%B6%5Credis%E5%9B%BE%E7%89%87%5Credis%E5%90%8E%E5%8F%B0%E8%BF%90%E8%A1%8C.png)]
-
11.再次启动查看进程
./redis-server /usr/myredis/redis.conf # 查看进程 ps -ef|grep redis
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AhQV67oM-1603532821390)(E:%5CY2%5CTypora%E7%AC%94%E8%AE%B0%5CSSM%E6%A1%86%E6%9E%B6%5Credis%E5%9B%BE%E7%89%87%5C%E5%81%9C%E6%AD%A2redis.png)]
可以看到在6379端口号已启动了redis
-
12.客户端链接和退出
# 连接 cd /usr/local/redis/bin ./redis-cli 默认是-h 127.0.0.1 -p 6379 # 退出 quit ping PONG
-
13.停止redis
cd /usr/local/redis/bin ./redis-cli shutdown 或者 pkill redis-server 再次查看进程 ps -ef|grep redis
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hxxyAl7v-1603532821391)(E:%5CY2%5CTypora%E7%AC%94%E8%AE%B0%5CSSM%E6%A1%86%E6%9E%B6%5Credis%E5%9B%BE%E7%89%87%5C%E5%81%9C%E6%AD%A2redis.png)]
-
14.开机自启redis的配置
vim etc/rc.local 加入 /usr/local/redis/bin/redis-server /usr/myredis/redis-conf
-
15.bin目录下的文件说明
redis-benchmark:性能检测工具
redis-check-aof:检测aof日志的工具
redis-check-rdb:检查rdb日志的工具
redis-cli:连接用的客户端(连接redis)
redis-server:redis服务进程(启动redis)
redis 可以启用多个,只需要把redis-conf中的端口改为其他端口号即可,默认为6379
-
安装成功后只是串讲
1.默认16个兄弟一起站台
默认16个数据库,类似数组下标从零开始,初始默认使用零号库.
2.切换数据库命令
select 1(index:数据库下标)
#####3.常用基本命令
dbsize:查看当前数据库key的数量
flushdb:清空当前库
Flushall:通杀全部库
3.其他说明
同一密码管理,16个库都是同样密码,要么都OK要么一个也连接不上.redis索引都是从零开始
redis数据类型
字符串类型Map<String,String>
字符串类型是编程语言和应用程序中最常见和最有用的数据类型,也是Redis的基本数据类型之一,事实上,Redis中所有键都必须是字符串
list数据类型Map<String,List>
列表是应用我们应该程序开发中非常有用的数据类型之一,列表能存一组对象,因此它也可以被用于栈或者队列,在Redis中,与键相关联的值可以是字符串组成的列表,Redis中的列表更像是数据列表中的双向列表
hash数据类型Map<String,Map<Object,Object>>
哈希表示字段和值之间的映射关系,与JAVA中的Map类似,Redis数据库本身就可以看作一个哈希,其中字符串类型的键关联到如字符串和列表之类的数据对象,而Redis的数据对象也可以再次使用哈希,其字段和值必须是字符串
set数据类型Map<String,Set<Object,Object>>
集合类型是由唯一,无序对象组成的集合,它经常用于测试某个成员是集合中,重复项删除和集合运算(求开,交,差集),Redis 的值对象可以是字符串集合
zset(sortset)数据类型
Redis的相关命令详解
常用的命令网站:https://www.redis.net.cn/order
1.常用命令
keys * 获取所有的key
select 0 选择第一个库
move myString 1 将当前的数据库key移动到某个数据库,目标库有,则不能移动
flushdb 清除指定库
randomkey 从当前库中随机返回
type key 类型
del key1 删除key
exists key 判断是否存在key
expire key 10 10过期(设置key的过期时间)
pexpire key 1000 毫秒
persist key 删除过期时间
ttl key 查看还有多少秒过期,-1表示永不过期,-2表示已过期
2.String类型命令
语法:set name cxx
get name
getrange name 0 -1 字符串分段 0 -1是全部
getset name new_cxx 设置值,返回旧值
mset key1 key2 批量设置
mget key1 key2 批量获取
setnx key value 不存在就插入(not exists)
setrange key index value 从index开始替换value
incr age 递增
incrby age 10 递增
decr age 递减
iincrbyfloat 增减浮点数
append 追加
strlen 长度
object encoding key 得到key的类型 string 里面有三种编码
int 用于能够副作用64位有符号整数表示的字符串
enbstr 用于长度小于或等于44字节 Redis3.x中是39字节,这种类型的编码在内存使用时性能更好
raw 用于长度大于44字节的
3.list[集合数组]
语法 lpush key values
lpush mylist a b c 左插入
rpush mylist x y z 右插入
lrange mylist 0 -1 去除数据集合 0 -1:是取出所有 0 1:取第一个和第二个
lpop mylist 弹出集合最后一个元素 弹出之后就没有了
rpop mylist 弹出第一个元素 弹出之后就没有了
llen mylist 长度
lrem mylist count value 删除
|-count 的值可以是以下几种:
|--count > 0:从表头开始向表尾搜索,移除与value相等的元素,数量为count
|--count < 0:从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值
|--count = 0:移除表中所有与value相等的值
lindex mylist 2 指定索引的值
lset mylist 2 n 索引设值
ltrim mylist 0 4
|-- 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不再指定区间内的元素都将被删除
下标0表示列表的第一个元素,以1表示列表的第二个元素,以此类推
你也可以使用负数下标,以-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,以此类推
linsert mylist before a 插入
linsert mylist after a 插入
|--命令用于在列表的元素前或者后插入元素.当指定元素不存在于列表中时,不执行任何操作.当列表不存在时,被视为空列表,不执行任何操作.如果key不是列表类型,返回一个错误
rpoplpush list list2 转移列表的数据
|--命令用于移除列表的最后一个元素,并将该元素添加到另一个列表并返回
4.hash
语法:hash key value-key value-value
hset myhash name cxx
|hset myhash name cxx
|--命令用于为哈希表中的字段赋值
|--如果哈希表不存在,一个新的哈希表被创建并进行hset操作
|--如果字段已经存在于哈希表中,但值将被覆盖
hget myhash name
hmset myhash name cxx age 25 note
hmget muhash name myhash age note
hgetall myhash 获取所有的
hexists myhash name 是否存在
hsetnx myhash score 100 设置不存在的 如果存在,不做处理
hincrby mmybash id 1 递增
hdel myhash name 删除
hkeys myhash 只取key
hvals myhash 只取value
hlen myhash 长度
5.set
sadd myset redis
smembers myset 数据集合
srem myset set1 删除
sismember myset set1 判断元素是否在集合中
scard key name 个数
sdiff key1 key ... | sinter |ssunion 操作:集合间运算: 差集 |交集 |并集
srandmember 随机获取集合中的元素
spop 从集合中弹出一个元素
6.zset
zadd zset 1 one
zadd zset 2 two
zadd zset 3 three zincrby zset 1 one
zincrby zset 1 one 增长分数
zscore zset two 获取分数
zrange zset 0 -1 withscores 范围值
zrangebyscore zset 10 25 withscores 指定范围的值
zrangebyscore zset 10 25 withscores limit 1 2 分页
zrevrangebyscore zset 10 25 withscores l 指定范围的值
zcard zset 元素数量
zcount zset 获得指定分数范围内的多个元素
zrem zset one two 删除一个或多个元素
zremrangebyrank zset 0 1 安装排名范围删除元素
zremrangebyscore zset 0 1 按照分数范围删除元素
zrank zset 0 -1 分数最小的元素排名为0
zrevrank zset 0 -1 分数最大的元素排名为0
使用本地连接工具(Redis Desktop Manager)连接虚拟机上的redis
使用本地工具连接时,必须关闭虚拟机防火墙,
systemctl stop firewalld
ps -ef | grep redis
查看redis进程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jRQQVLdW-1603532821392)(E:%5CY2%5CTypora%E7%AC%94%E8%AE%B0%5CSSM%E6%A1%86%E6%9E%B6%5Credis%E5%9B%BE%E7%89%87%5CRedis%20Desktop%20Manager%E8%BF%9E%E6%8E%A5redis.png)]
Java连接Redis
1.Jedis所需要的jar包依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
</dependency>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IqsFvRIe-1603532821393)(E:%5CY2%5CTypora%E7%AC%94%E8%AE%B0%5CSSM%E6%A1%86%E6%9E%B6%5Credis%E5%9B%BE%E7%89%87%5CJava%E8%BF%9E%E6%8E%A5Redis%E9%9C%80%E8%A6%81jar%E5%8C%85.png)]
2.Java常用操作
2.1测试连通性
package com.sxt;
import redis.clients.jedis.Jedis;
public class App {
public static final String HOST = "192.168.1.121";
public static final Integer HOST_IP = 6379;
public static void main(String[] args) {
// 创建连接
Jedis jedis = new Jedis(HOST,HOST_IP);
// 设置密码,如果没有可以不写
// jedis.auth("123456");
System.out.println(jedis);
// 调用ping
String ping = jedis.ping();
// 输出PONG
System.out.println(ping);
// 一定要注意:关闭
jedis.close();
}
}
3.JedisPool
3.1 为什么要使用JedisPool
1.获取Jedis实例需要从JedisPool中获取
2.用完Jedis实例需要返还给JedisPool
3.如果Jedis在使用过程中出错,则也需要还给JedisPool
docker部署redis[基于ECS]
部署需要:一台阿里云服务器(配置docker容器)
打开阿里云运行docker
docker run -d --name myredis -p 6390:6379 redis --requirepass "123456"
连接
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xvaUSwSa-1603532821394)(E:%5CY2%5CTypora%E7%AC%94%E8%AE%B0%5CSSM%E6%A1%86%E6%9E%B6%5Credis%E5%9B%BE%E7%89%87%5C%E8%BF%9E%E6%8E%A5%E9%98%BF%E9%87%8C%E4%BA%91redis.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NaWOMcew-1603532821395)(E:%5CY2%5CTypora%E7%AC%94%E8%AE%B0%5CSSM%E6%A1%86%E6%9E%B6%5Credis%E5%9B%BE%E7%89%87%5C%E9%98%BF%E9%87%8C%E4%BA%91%E5%BC%80%E6%94%BE%E7%AB%AF%E5%8F%A3-%E9%85%8D%E7%BD%AE%E8%A7%84%E5%88%99.png)]
连接不上因为阿里云的端口没有开放
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kgS99BMc-1603532821396)(E:%5CY2%5CTypora%E7%AC%94%E8%AE%B0%5CSSM%E6%A1%86%E6%9E%B6%5Credis%E5%9B%BE%E7%89%87%5C%E9%98%BF%E9%87%8C%E4%BA%91%E5%BC%80%E6%94%BE%E7%AB%AF%E5%8F%A3.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lxW9f9ZU-1603532821397)(E:%5CY2%5CTypora%E7%AC%94%E8%AE%B0%5CSSM%E6%A1%86%E6%9E%B6%5Credis%E5%9B%BE%E7%89%87%5C%E9%83%A8%E7%BD%B2%E6%88%90%E5%8A%9Fredis.png)]
spring + redis + mysql 做缓存
创建项目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-27sLInW1-1603532821398)(E:%5CY2%5CTypora%E7%AC%94%E8%AE%B0%5CSSM%E6%A1%86%E6%9E%B6%5Credis%E5%9B%BE%E7%89%87%5Cspring+redis+mysql-%E5%88%9B%E5%BB%BA%E9%A1%B9%E7%9B%AE.png)]
2.修改pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sxt</groupId>
<artifactId>01-redis-java</artifactId>
<version>1.0</version>
<!-- jar包版本声明 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<mybatis.version>3.5.2</mybatis.version>
<mybatis-spring.version>2.0.2</mybatis-spring.version>
<spring.version>4.3.24.RELEASE</spring.version>
<druid.version>1.0.18</druid.version>
<mysql.version>5.1.46</mysql.version>
<fastjson.version>1.2.59</fastjson.version>
<!-- 注意只能使用2.0以下的版本 -->
<log4j.version>1.2.17</log4j.version>
<jedis.version>3.1.0</jedis.version>
<lombok.version>1.18.12</lombok.version>
</properties>
<!-- 声明需要的依赖的具体的资源 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
<!-- 导入spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</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-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- mysql数据驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- json -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
</project>
创建application-redis.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 声明配置 -->
<bean id="poolConfig" class="org.apache.commons.pool2.impl.GenericObjectPoolConfig">
<property name="maxTotal" value="100"/>
<property name="maxIdle" value="80"/>
<property name="minIdle" value="20"/>
<property name="maxWaitMillis" value="2000"/>
<property name="testOnBorrow" value="true"/>
</bean>
<!-- jedispool -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<!-- 因为jedisPool没有属性 所以只能使用构造器的注入方式 -->
<constructor-arg name="poolConfig" ref="poolConfig"/>
<constructor-arg name="host" value="192.168.1.121"/>
<constructor-arg name="port" value="6379"/>
<constructor-arg name="timeout" value="2000"/>
<constructor-arg name="password" value=""/>
</bean>
</beans>
生成User
生成UserMapper
生成UserService
生成UserServiceImpl
lue=“2000”/>
<!-- jedispool -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<!-- 因为jedisPool没有属性 所以只能使用构造器的注入方式 -->
<constructor-arg name="poolConfig" ref="poolConfig"/>
<constructor-arg name="host" value="192.168.1.121"/>
<constructor-arg name="port" value="6379"/>
<constructor-arg name="timeout" value="2000"/>
<constructor-arg name="password" value=""/>
</bean>
~~~
生成User
生成UserMapper
生成UserService
生成UserServiceImpl
学习:Sonar