文章目录
Redis
什么是Redis?
- 遵守Bsd协议:可以随意修改代码重新发布,自定义强,开源免费
- 是一个高性能的Nosql(Key-Value)数据库,非关系型数据库
- 数据放在内存中读取速度极快,但耗内存,支持数据的持久化:定时快照,基于aof两种持久化机制;一般配合使用
为什么要使用Redis?
- 传统的关系型数据库,对高并发读写的需求不能满足,性能比较低,Redis非关系型数据库数据存放在内存中所以速度极快,极大的减轻了关系型数据库的负担
- Redis产生解决了大规模数据,多重属数据类型产生的复杂性问题
- 可以简单解决诸多复杂场景应用,如:设置数据过期时间;网站访问点击量;缓存;热点数据;排行榜;消息系统,,等等
Redis如何使用?
安装:
Redis中文网:http://www.redis.cn/download.html
-
安装gcc环境:
yum install -y gcc gcc-c++
-
解压到opt目录:
tar -zxvf redis-5.0.7.tar.gz -C /opt
-
进入redis解压目录进行编译:
make
-
在该目录下执行安装:
make PREFIX=/usr/local/redis install
-
启动:进入redis安装目录执行
./bin/redis-server
启动服务端
-
新建命令窗口启动客户端:
./bin/redis-cli
到此安装完成,可通过ctrl+c退出两个客户端
Redis配置文件
- 首先进行redis.conf配置文件进行备份:
cp redis.conf /usr/local/redis
- 配置文件介绍
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#注释掉这一行,不然只能在本机访问redis
#bind 127.0.0.1
protected-mode yes
#Redis默认端口号
port 6379
tcp-backlog 511
#客户端闲置多长时间关闭,0的话代表不开启此功能
timeout 0
tcp-keepalive 300
#redis默认不是守护进程启动,开启守护进程把参数变为yes
daemonize no
supervised no
#守护进程启动时redis会把pid写入这个文件中
pidfile /var/run/redis_6379.pid
#记录日志级别共四个级别:debug,verbose,notice,warning
loglevel notice
#日志记录方式
logfile ""
#设置数据库数数量,默认提供16个
databases 16
#指定多长时间内,有多少次更新操作就会同步到数据文件(持久化)
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
#压缩持久化文件
rdbcompression yes
rdbchecksum yes
# 数据持久化到硬盘的文件名称
dbfilename dump.rdb
#持久化文件放到当前文件目录下
dir ./
#设置数据库密码默认没有
requirepass foobared
开始使用
首先要想用可视化连接需要设置redis的密码:修改配置文件
常用命令key管理
keys *#返回满足的所有键,可以模糊匹配如:keys asb*
exists key #是否存在指定的key,存在返回1,不存在返回0
expire key secode #设置某个key的过期时间,单位秒
del key #删除某个key
ttl key #查看剩余时间,当key不存在时返回-2,存在但没有设置剩余生存时间,返回-1,否则,以秒为单位,返回key的剩余生存时间
persist key #取消过期时间
PEXPIRE key millisecodes: #修改key的过期时间为毫秒
select #选择数据库 0-15(默认16个数据库),多个数据库是为了数据的安全和备份
move key dbundex #将当前数据中的key转移到其他数据库
randomkey #随即返回一个key
rename key key2 #重命名key
echo #打印命令
dbsize #查看数据库中key的数量
info #查看数据库信息
config get #实时存储收到的请求,返回相关的配置
flushdb #清空当前的数据库
flushdball #清空所有的数据库
key命名规范
- key不要太长,不然小号内存,降低查询效率
- key不要太短,太短可读性差
- 在一个项目中key最好使用统一的命名规范如
- key区分大小写
五种Redis最常用数据类型
String命令===Java的String字符串
简介:
- String是Redis最基本的数据类型,一个键最大能存储512MB
- String数据结构最简单的key-value类型,value不仅是字符串,也可以是数字,是包含很多种类型的特殊类型
- String类型是二进制安全的,可以包含任意数据,如:序列化的对象存储,一张图片进行二进制存储,一个简单的字符串数值等等
命令
set key value #指定一个key赋值,多次设置相同的key会覆盖之前的值
setnx key1 value #如果key不存在设置该值并返回1,若存在不进行任何操作返回0
setex key 10 tiantian 设置key的过期时间为10秒。10秒后删除该key
settrange string range value #替换字符串
get key #根据key去除value,不存在返回nil
getrange key start end #用于获取存储在指定key中字符串指定的子字符串,包括start和end
getbit key offset #获取key所存储的字符串值,获取指定偏移量的位
getset key name #指定key的值并返回之前的旧值,当key为空时返回nil
strlen key #返回key所存储的字符串值的长度
del key #删除指定key,如果存在返回值数字类型
incr num #自增,将value存储的值自增加一
decr num #自减
String应用场景
- string通常用于保存单个字符串或json字符串数据
- 因为string时二进制安全的,所以完全可以把一个图片的内容作为字符串来存储
- 计数器(微博粉丝,点击量,短信验证码,投票等等)
Hash类型==Java的Map
简介:
- 适合存储对象,比string占用更少内存空间
命令
hset key field value #设置键值
hmset key field1 value1 field2 value2 #可以一次设置多个值
hget key field #获取存储到hash中的值根据field获取value
hmget key field field2 #一次获取多个值
hgetall key #获取所有字段和值
hkeys key #获取所有哈希表中的字段
hlen key #获取哈希表中字段的数量
hdel key field1 ... #删除指定field的值
hsernx key field value #只有在字段field不存在时,设置字段值
hincrby key field increment #为指定整型值增加increment
hexists key field #查看是否存在
应用场景
- 存储一个用户信息数据,他是最接近关系型数据库的类型,操作对象比string更加方便
- 存储的其实是一个heshmap
Redis整合SpringBoot
<?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>org.example</groupId>
<artifactId>boot-Jedis</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
</project>
全局配置文件,一般不用了解就好
server:
port: 8080
spring:
redis:
port: 6379
password: root #改成自己的
host: 181.72.39.145 #改成自己的
jedis:
pool:
max-idle: 6 #最大空闲数
max-active: 10 #最大连接数
min-idle: 2 #最小空闲数
timeout: 5000 #连接超时
配置类
package site.tian.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
@Configuration
@Slf4j
public class JedisConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Value("${spring.redis.password}")
private String password;
@Value("${spring.redis.timeout}")
private int timeout;
@Value("${spring.redis.jedis.pool.max-active}")
private int maxActive;
@Value("${spring.redis.jedis.pool.max-idle}")
private int maxIdle;
@Value("${spring.redis.jedis.pool.min-idle}")
private int minIdle;
@Bean
public JedisPool jedisPool() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(maxIdle);
jedisPoolConfig.setMinIdle(minIdle);
jedisPoolConfig.setMaxTotal(maxActive);
JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, password);
log.info("JedisPool连接成功"+host+"\t"+port);
return jedisPool;
}
}
推荐使用lettuce
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<!--必须-->
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
set类似java的HashTable集合(无序)
应用长场景
常用于两个集合间数据交集、并集、差集运算
- 利用集合操作,可以取不同兴趣圈子的交集,以非常方便的实现共同关注,二度好友等功能
- 利用唯一性们可以统计访问网站的所有独立ip,存取活跃用户
zset类似java的HashTable集合(有序)
有序不重复,
应用长场景
销量排行积分排名,主要是可以排序