Redis基础
1、Redis入门
1.1、Redis简介
Redis is an open source (BSD licensed), in-memory **data structure store** used as a database, cache, message broker
,翻译为:Redis是一个开源的内存中的数据结构存储系统,它可以用作:数据库、缓存和消息中间件。
官网:https://redis.io
Redis时勇C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供的数据是可以道道 100000+ 的QPS(每秒查询次数)。他存储的value类型比较丰富,也被称为结构化的NoSql数据库。
NoSql(Not Only SQL),不仅仅时SQL,泛指 非关系下数据库 。NoSql数据库被捕时要取代关系型数据库,二十关系型数据库的补充。
Redis特点:
- 基于内存存储,读写性能高
- 适合存储热点数据(热点商品、咨询、新闻)
- 存储短时间内可能有大量访问的数据
- 企业应用广泛
数据库分类:
- 关系型数据库(RDBMS)
- MySQL
- Oracle
- DB2
- SQLServer
- 非关系型数据库(NoSQL)
- Redis
- MongogDB
- MemCached
Redis应用场景:
- 缓存
- 任务队列
- 消息队列
- 分布式锁
1.2、Redis下载安装
Redis安装包下载
- Windows版下载地址:https://github.com/microsoftarchive/redis/releases
- Linux版下载地址:https://github.com/redis/redis/archive/7.0.0.tar.gz
在Linux系统安装 Redis 步骤:
-
将Redis安装包上传到Linux
-
解压安装包,命令:
tar -zxvf redis-4.0.0.tar.gz -C /usr/local
-
安装 Redis 的依赖环境 gcc,命令:
yum install gcc-c++
-
进入
/usr/local/redis-4.0.0
,进行编译,命令:make
-
进入 Redis 的 src 目录,进行安装,命令:
make install
在Windows系统安装 Redis :
Redis的Windows版属于绿色软件(免安装),直接解压即可使用,解压后目录如下:
1.3、Redis服务启动停止
Linux中的 Redis 服务启动,可以使用 redis-server
,默认端口号为 6379
Ctrl + C
可以停止 Redis 服务
redis.conf
文件配置:
daemonize yes # 是否后台运行
requirepass password # Redis连接密码
bind 127.0.0.1 -::1 # 注释掉才可以远程连接
database 0 # 提供的数据库数量
连接 Redis 服务:
redis-cli -h localhost -p 6379 -a password # localhost 可以为IP地址 password 为密码
Windows系统中启动 Redis ,自己双击 redis-server.exe
即可启动 Redis 服务,Redis 服务默认端口号为 6379
Ctrl + C
可以停止 Redis 服务
连接 Redis 服务:
redis-cli -h localhost -p 6379 -a password # localhost 可以为IP地址 password 为密码
2、数据类型
Redis 存储的是 Key-Value 结构的数据,其中Key是字符串类型,Value有5种常用的数据类型:
- 字符串
string
- 哈希
hash
- 列表
list
- 集合
set
- 有序集合
sorted set
2.1、字符串 string
Redis 中字符串类型常用命令:
命令 | 说明 |
---|---|
SET key value | 设置指定 key 的值 |
GET key | 获取指定 key 的值 |
SETEX key seconds value | 设置指定 key 的值,并将 key 的过期时间设为 seconds 秒 |
SETNX key value | 只有再 key 不存在时设置 key 的值 |
2.2、哈希 hash
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象,常用命令:
命令 | 说明 |
---|---|
HSET key field value | 将哈希表key中的字段 field 的值设为 value |
HGET key field | 获取存储在哈希表中指定字段的值 |
HDEL key field | 删除存储在哈希表中指定字段 |
HKEYS key | 获取哈希表中所有字段 |
HVALS key | 获取哈希表中所有值 |
HGETALL key | 获取在哈希表中指定key的所有字段和值 |
2.3、列表 list
Redis 列表是简单的字符串列表,按照插入顺序排序,常用命令:
命令 | 说明 |
---|---|
LPUSH key value1 [value2] | 将一个或多个值插入到列表头部 |
LRANGE key start stop | 获取列表指定范围内的元素 |
RPOP key | 移除并获取列表指定范围内的元素 |
LLEN key | 获取列表长度 |
BRPOP key [key2] timeout | 移出并获取列表的最后一个元素,如果列表没有元素会注射列表知道等待超时或发现可弹出元素位置 |
2.4、集合 set
Redis set 是 string 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据,常用命令:
命令 | 说明 |
---|---|
ADD key member1 [member2] | 向集合添加一个或多个成员 |
SMEMBERS key | 返回集合中的所有成员 |
SCARD key | 获取集合的成员数 |
SINTER key1 [key2] | 返回给定所有集合的交集 |
SUNION key1 [key2] | 返回所有给定集合的并集 |
SDIFF key1 [key2] | 返回给定所有集合的差集 |
SREM key member1 [member2] | 移除集合中一个或多个成员 |
2.5、有序列表 sorted set
Redis sorted set 有序集合是 string类型元素的集合,且不允许重复的成员。每个元素都会关联一个 double 类型的番薯(score)。redis 真是通过分数来为集合中的成员进行从小大大排序。有序集合的成员是唯一的,但分数却可以重复。
命令 | 说明 |
---|---|
ZADD key score1 member1 [score2 member2] | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
ZRANGE key start stop [WITHSCORES] | 通过索引区间返回有序集合中指定区间内的成员 |
ZINCRBY key increment member | 有序集合中对指定成员的分数加上增量 increment |
ZREM key member [member ...] | 移除有序集合中的一个或多个成员 |
2.6、常用命令
命令 | 说明 |
---|---|
KEYS pattern | 查找所有符合给定模式(pattern)的 key |
EXISTS key | 检查给定 key 是否存在 |
TYPE key | 返回 key 说储存的值的类型 |
TTL key | 返回给定 key 的剩余生存时间(TTL,time to live),以秒为单位 |
DEL key | 该命令用于在 key 存在时删除 key |
3、在Java中操作Redis
3.1、介绍
Redis 的 Java 客户端很多,官方推荐的有三种:
- Jedis
- Lettuce
- Redisson
Spring 对 Redis 客户端进行了整合,提供了 Spring Data Redis,在 SpringBoot 项目中还提供了对应的 Starter,即spring-boot-starter-data-redis
3.2、Jedis
Jedis的Maven坐标:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.2.3</version>
</dependency>
使用 Jedis 的步骤:
- 获取连接
- 执行操作
- 关闭连接
// 获取所有key
@Test
public void getKeys() {
// 1.获取连接
Jedis jedis = new Jedis("localhost", 6379);
// 2.执行具体操作
Set<String> result = jedis.keys("*");
for (String s : result) {
System.out.println(s);
}
// 3.关闭连接
jedis.close();
}
3.3、Spring Data Redis
在 SpringBoot 项目中,可以使用 Spring Data Redis 来简化 Redis 操作,maven 坐标:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
Spring Data Redis 中提供了一个高度封装的类:RedisTemplate,针对 Jedis 客户端中大量 API 进行了归类封装,将同一类型操作封装为 operation
接口,具体分类如下:
ValueOperations
:简单的 K-V 操作SetOperations
:set 类型数据操作ZSetOperations
:zset 类型的数据操作HashOperations
:针对 map 类型的数据操作ListOperations
:针对 list 类型的数据操作
chmod 755 redis-install.sh && sh redis-install.sh 4.0.10
#! /usr/bin/bash
##redis任何版本全程自动化源码编译安装
##用法:sh redis-install.sh 4.0.10 (后面跟的是你需要的版本号,需要什么版本就写什么版本),我这里安装的4.0.10
version=$1
usage(){
echo "usage: $0 version"
}
if [ $# -ne 1 ]
then
usage
exit -1
fi
#Redis安装包下载
cd /usr/local/src
if [ ! -f redis-${version}.tar.gz ]
then
curl -o /usr/local/src/redis-${version}.tar.gz http://download.redis.io/releases/redis-${version}.tar.gz
fi
#Redis依赖包安装
yum clean all
yum makecache fast
yum -y install gcc gcc-c++ tcl
#编译Redis所需要的gcc
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
source /opt/rh/devtoolset-9/enable
echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
gcc --version
##内系统参数核优化
cat >> /etc/rc.d/rc.local << "EOF"
##关闭Linux的THP(内存管理系统)通过使用更大的内存页面,来减少具有大量内存的计算机上的TLB的开销
if [ -f /sys/kernel/mm/transparent_hugepage/enabled ]
then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if [ -f /sys/kernel/mm/transparent_hugepage/defrag ]
then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
EOF
chmod u+x /etc/rc.d/rc.local
if [ -f /sys/kernel/mm/transparent_hugepage/enabled ]
then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if [ -f /sys/kernel/mm/transparent_hugepage/defrag ]
then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
cat >> /etc/sysctl.conf << "EOF"
#Linux系统内核参数优化
net.core.somaxconn = 2048
net.ipv4.tcp_max_syn_backlog = 2048
vm.overcommit_memory = 1
EOF
sysctl -p
cat > /etc/security/limits.conf << "EOF"
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535
EOF
#Redis编译安装
cd /usr/local/src
tar -zxvf redis-${version}.tar.gz
cd /usr/local/src/redis-${version}
make
make PREFIX=/usr/local/redis install
#Redis基础配置
mkdir -p /usr/local/redis/{etc,logs,data}
egrep -v "^$|^#" /usr/local/src/redis-${version}/redis.conf > /usr/local/redis/etc/redis.conf
#sed -i "s/bind 127.0.0.1/bind 0.0.0.0/g" /usr/local/redis/etc/redis.conf
sed -i "s/protected-mode yes/protected-mode no/g" /usr/local/redis/etc/redis.conf
sed -i "s/daemonize no/daemonize yes/g" /usr/local/redis/etc/redis.conf
sed -i "s/pidfile \/var\/run\/redis_6379.pid/pidfile \/usr\/local\/redis\/redis.pid/g" /usr/local/redis/etc/redis.conf
sed -i "s/dir \.\//dir \/usr\/local\/redis\/data/g" /usr/local/redis/etc/redis.conf
sed -i "s/logfile \"\"/logfile \"\/usr\/local\/redis\/logs\/redis.log\"/g" /usr/local/redis/etc/redis.conf
sed -i "s/dbfilename dump.rdb/dbfilename dump.rdb/g" /usr/local/redis/etc/redis.conf
sed -i "s/appendfilename \"appendonly.aof\"/appendfilename \"appendonly.aof\"/g" /usr/local/redis/etc/redis.conf
#PATH配置
echo "export PATH=${PATH}:/usr/local/redis/bin" >>/etc/profile
source /etc/profile
#启动redis服务
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
#查看redis监听端口
netstat -tanp|grep redis
i “s/dbfilename dump.rdb/dbfilename dump.rdb/g” /usr/local/redis/etc/redis.conf
sed -i “s/appendfilename “appendonly.aof”/appendfilename “appendonly.aof”/g” /usr/local/redis/etc/redis.conf
#PATH配置
echo “export PATH=${PATH}:/usr/local/redis/bin” >>/etc/profile
source /etc/profile
#启动redis服务
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
#查看redis监听端口
netstat -tanp|grep redis