文章目录

  • Redis 内存数据库
  • 第一部分:初识 Redis
  • 01-初识Redis之认识 Redis
  • 02-初识Redis之安装 Redis
  • 03-初识Redis之Redis 客户端
  • Redis命令行客户端
  • 图形化桌面客户端
  • 第二部分:Redis 常见命令
  • 04-Redis 数据结构介绍
  • 05-Redis 通用命令
  • 06-String 类型命令
  • 07-Hash 类型命令
  • 08-List 类型命令
  • 09-Set 类型命令
  • 10-SortedSet 类型命令
  • 第三部分:Jedis 客户端
  • 11-Jedis 客户端之Jedis 连接
  • 12-Jedis 客户端之String 操作
  • 13-Jedis 客户端之JedisPool 连接池


Redis 内存数据库


Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。

redis ADDSLOTS 多个slot redis 多个库_客户端

# 官方网站:
	https://redis.io/

# 中文网站:
	http://www.redis.cn/

第一部分:初识 Redis

01-初识Redis之认识 Redis


官方定义:Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。

  • 所有数据存储在内存中,并且有持久化机制
  • 每次redis重启,会从文件中重新加载数据到内存,所有读写都只基于内存
  1. 支持多种类型的数据结构,字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。
  2. Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

Redis 数据库主要应用场景:

  • 缓存:用于实现大数据量高并发的大数据量缓存【临时性存储】
  • 网站架构中:接受高并发的缓存读写请求
  • 数据库:用于实现高性能的小数据量读写【永久性存储】
  • 大数据平台中:高性能,一般用于作为实时计算结果的存储

02-初识Redis之安装 Redis


大多数企业都是基于Linux服务器来部署项目,而且Redis官方也没有提供Windows版本的安装包。因此课程中基于Linux系统来安装Redis,此处选择的Linux版本为CentOS 7。

下载地址:https://download.redis.io/releases/

redis ADDSLOTS 多个slot redis 多个库_学习_02

  • 下载源码
wget https://download.redis.io/releases/redis-5.0.8.tar.gz
  • 安装依赖
    Redis是基于C语言编写的,因此首先需要安装Redis所需要的gcc依赖:
yum -y install gcc-c++ tcl

redis ADDSLOTS 多个slot redis 多个库_学习_03

  • 上传源码
cd /export/software/
rz
	redis-5.0.8.tar.gz

redis ADDSLOTS 多个slot redis 多个库_客户端_04

  • 解压
tar -zxvf redis-5.0.8.tar.gz -C /export/server/
  • 编译安装
# 进入源码目录
cd /export/server/redis-5.0.8/

# 编译
make

redis ADDSLOTS 多个slot redis 多个库_Redis_05

# 安装,并指定安装目录
make PREFIX=/export/server/redis install

redis ADDSLOTS 多个slot redis 多个库_学习_06

  • 复制配置文件
cp /export/server/redis-5.0.8/redis.conf /export/server/redis/

redis ADDSLOTS 多个slot redis 多个库_学习_07

  • 创建目录
# redis日志目录
mkdir -p /export/server/redis/logs

# redis数据目录
mkdir -p /export/server/redis/datas

redis ADDSLOTS 多个slot redis 多个库_客户端_08

  • 修改配置
vim /export/server/redis/redis.conf
## 69行,配置redis服务器接受链接的网卡,表示任意机器都可以连接Redis服务
bind 0.0.0.0

## 136行,redis是否后台运行,设置为yes
daemonize yes

## 171行,设置redis服务日志存储路径
logfile "/export/server/redis/logs/redis.log"

## 263行,设置redis持久化数据存储目录
dir /export/server/redis/datas/
  • 配置环境变量
vim /etc/profile
# REDIS HOME
export REDIS_HOME=/export/server/redis
export PATH=:$PATH:$REDIS_HOME/bin
source /etc/profile
  • 服务启动
# 启动,指定配置文件
/export/server/redis/bin/redis-server /export/server/redis/redis.conf
  • 查看启动
ps -ef|grep redis

redis ADDSLOTS 多个slot redis 多个库_redis_09

  • 命令行客户端
redis-cli -h node1 -p 6379

redis ADDSLOTS 多个slot redis 多个库_redis_10

  • 测试
  • 关闭服务
  • 方式一:客户端中
shutdown
  • 方式二:Linux命令行
kill -9 redis的pid
  • 方式三:通过客户端命令进行关闭
redis-cli -h node1 -p 6379  shutdown
  • 启动脚本
vim /export/server/redis/bin/redis-start.sh

添加内容

#!/bin/bash 
  
REDIS_HOME=/export/server/redis
${REDIS_HOME}/bin/redis-server ${REDIS_HOME}/redis.conf

执行权限

chmod u+x /export/server/redis/bin/redis-start.sh

03-初识Redis之Redis 客户端


安装完成Redis,可以操作Redis,实现数据的CRUD,需要用到Redis客户端,包括:

  • 命令行客户端
  • 图形化桌面客户端
  • 编程客户端
Redis命令行客户端

Redis安装完成后就自带了命令行客户端:redis-cli,使用方式如下:

redis-cli [options] [commonds]

其中常见的options有:

  • -h node1:指定要连接的redis节点的IP地址,默认是127.0.0.1
  • -p 6379:指定要连接的redis节点的端口,默认是6379

其中的commonds就是Redis的操作命令,例如:

  • ping:与redis服务端做心跳测试,服务端正常会返回pong

不指定commond时,会进入redis-cli的交互控制台:

redis ADDSLOTS 多个slot redis 多个库_redis_11

图形化桌面客户端

GitHub上的大神编写了Redis的图形化桌面客户端,地址:https://github.com/uglide/RedisDesktopManager

不过该仓库提供的是RedisDesktopManager的源码,并未提供windows安装包。

在下面这个仓库可以找到安装包:https://github.com/lework/RedisDesktopManager-Windows/releases

redis ADDSLOTS 多个slot redis 多个库_学习_12

安装RedisDesktopManager

解压缩后,运行安装程序即可安装,此处略。

redis ADDSLOTS 多个slot redis 多个库_客户端_13

安装完成后,在安装目录下找到rdm.exe文件:

redis ADDSLOTS 多个slot redis 多个库_Redis_14

双击即可运行:

redis ADDSLOTS 多个slot redis 多个库_客户端_15

建立连接

点击左上角的连接到Redis服务器按钮:

redis ADDSLOTS 多个slot redis 多个库_redis_16

在弹出的窗口中填写Redis服务信息:

redis ADDSLOTS 多个slot redis 多个库_学习_17

点击确定后,在左侧菜单会出现这个链接:

redis ADDSLOTS 多个slot redis 多个库_redis_18

点击即可建立连接了:

redis ADDSLOTS 多个slot redis 多个库_Redis_19

[Redis默认有16个仓库,编号从0至15,配置文件可以设置仓库数量,但是不超过16,并且不能自定义仓库名称。]

第二部分:Redis 常见命令

Redis 内存数据库中常见数据类型及命令:

04-Redis 数据结构介绍


Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样

redis ADDSLOTS 多个slot redis 多个库_redis_20

Redis为了方便我们学习,将操作不同数据类型的命令也做了分组,在官网( https://redis.io/commands )可以查看到不同的命令:https://redis.io/commands/

redis ADDSLOTS 多个slot redis 多个库_redis_21

帮助命令:help

redis ADDSLOTS 多个slot redis 多个库_Redis_22

05-Redis 通用命令


Redis中通用命令语法:

  • keys:列举当前数据库中所有Key
  • 语法:keys 通配符
  • del key:删除某个KV
  • exists key :判断某个Key是否存在
  • 返回值:1,表示存在
  • 返回值:0,表示不存在
  • type key:判断这个K对应的V的类型的
  • expire K 过期时间:设置某个K的过期时间,一旦到达过期时间,这个K会被自动删除
  • ttl K:查看某个K剩余的存活时间
  • select N:切换数据库的
  • Redis默认由16个数据:db0 ~ db15,个数可以通过配置文件修改,名称不能改
  • Redis是一层数据存储结构:所有KV直接存储在数据库中
  • 默认进入db0
  • flushdb:清空当前数据库的所有Key
  • flushall:清空所有数据库的所有Key

06-String 类型命令


String 类型数据底层:三种存储类型 -> [string 字符串、int整数类型,float 浮点类型]

String 类型中常见命令

  • set:给String类型的Value的进行赋值或者更新
  • 语法:set K V
  • get:读取String类型的Value的值
  • 语法:get K
  • mset:用于批量写多个String类型的KV
  • 语法:mset K1 V1 K2 V2 ……
  • mget:用于批量读取String类型的Value
  • 语法:mget K1 K2 K3 ……
  • setnx:只能用于新增数据,当K不存在时可以进行新增
  • 语法:setnx K V
  • incr:用于对数值类型的字符串进行递增,递增1,一般用于做计数器
  • 语法:incr K
  • incrby:指定对数值类型的字符串增长固定的步长
  • 语法:incrby K N
  • decr:对数值类型的数据进行递减,递减1
  • 语法:decr K
  • decrby:按照指定步长进行递减
  • 语法:decrby K N
  • incrbyfloat:基于浮点数递增
  • 语法:incrbyfloat K N
  • strlen:统计字符串的长度
  • 语法:strlen K
  • getrange:用于截取字符串
  • 语法:getrange s2 start end,包头包尾

Redis 中key结构设置建议:

07-Hash 类型命令


Hash 类型常用命令:

  • hset:用于为某个K添加一个属性
  • 语法:hset K k v
  • hget:用于获取某个K的某个属性的值
  • 语法:hget K k
  • hmset:批量的为某个K赋予新的属性
  • 语法:hmset K k1 v1 k2 v2 ……
  • hmget:批量的获取某个K的多个属性的值
  • 语法:hmget K k1 k2 k3……
  • hgetall:获取所有属性的值
  • 语法:hgetall K
  • hdel:删除某个属性
  • 语法:hdel K k1 k2 ……
  • hlen:统计K对应的Value总的属性的个数
  • 语法:hlen K
  • hexists:判断这个K的V中是否包含这个属性
  • 语法:hexists K k
  • hvals:获取所有属性的value的
  • 语法:hvals K

08-List 类型命令


List 类型中常见命令:

  • lpush:将每个元素放到集合的左边,左序放入
  • 语法:lpush K e1 e2 e3……
  • rpush:将每个元素放到集合的右边,右序放入
  • 语法:rpush K e1 e2 e3……
  • lrange:通过下标的范围来获取元素的数据
  • 语法:lrange K start end
  • 注意:从左往右的下标从0开始,从右往左的下标从-1开始,一定是从小的到大的下标
  • lrange K 0 -1:所有元素
  • **llen:**统计集合的长度
  • 语法:llen K
  • lpop:删除左边的一个元素
  • 语法:lpop K
  • rpop:删除右边的一个元素
  • 语法:rpop K

09-Set 类型命令


Set 类型常见命令:

  • sadd:用于添加元素到Set集合中
  • 语法:sadd K e1 e2 e3 e4 e5……
  • smembers:用于查看Set集合的所有成员
  • 语法:smembers K
  • sismember:判断是否包含这个成员
  • 语法:sismember K e1
  • srem:删除其中某个元素
  • 语法:srem K e
  • scard:统计集合长度
  • 语法:scard K
  • sunion:取两个集合的并集
  • 语法:sunion K1 K2
  • sinter:取两个集合的交集
  • 语法:sinter K1 K2

10-SortedSet 类型命令


SortedSet 类型常用命令

  • zadd:用于添加元素到Zset集合中
  • 语法:zadd K score1 k1 score2 k2 ……
  • zrange:范围查询
  • 语法:zrange K start end [withscores]
  • zrevrange:倒序查询
  • 语法:zrevrange K start end [withscores]
  • zrem:移除一个元素
  • 语法:zrem K k1
  • zcard:统计集合长度
  • 语法:zcard K
  • zscore:获取评分
  • 语法:zscore K k

第三部分:Jedis 客户端

在Redis官网中提供了各种语言的客户端,地址:https://redis.io/clients

redis ADDSLOTS 多个slot redis 多个库_学习_23

常用Java客户端:Jedis、lettuce及Redisson

11-Jedis 客户端之Jedis 连接


Jedis的官网地址: https://github.com/redis/jedis,先来个快速入门:

  1. 引入依赖
<dependency>
	<groupId>redis.clients</groupId>
	<artifactId>jedis</artifactId>
	<version>3.2.0</version>
</dependency>
  1. 建立连接
// 建立连接
Jedis jedis = new Jedis("192.168.88.100", 6379);
// 选择库
jedis.select(0);
  1. 关闭连接,释放资源
// 释放资源
if (jedis != null) {
  jedis.close();
}

案例演示:构建Jedis连接,发送命令ping,查看是否连接。

package cn.itqzd.redis;

import redis.clients.jedis.Jedis;

/**
 * 获取Jedis连接,直接传递参数获取
 */
public class JedisConnTest {

	public static void main(String[] args) {
		// TODO: step1. 创建Jedis连接对象,创建参数
		Jedis jedis = new Jedis("node1", 6379);
		// 选择数据库
		jedis.select(0) ;

		// TODO: step2. 测试连接
		String pingValue = jedis.ping();
		System.out.println(pingValue);

		// TODO: step3. 关闭连接
		jedis.close();
	}

}

12-Jedis 客户端之String 操作


以Redis中String类型为例,使用Jedis API操作数据,进行set设置和get获取值。

  • Jedis API实现功能

set/get/exists/expire/ttl
  • 演示代码:
package cn.itqzdredis;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;

import java.util.concurrent.TimeUnit;

/**
 * Jedis API操作Jedis数据库中数据
 */
public class JedisApiTest {

	// 定义Jedis变量
	private Jedis jedis = null ;

	@Before
	public void open(){
		// TODO: step1. 获取连接
		jedis = new Jedis("node1", 6379);
	}

	@Test
	public void testString() throws Exception{
		// TODO: step2. 使用连接,操作Redis数据,数据类型为String
		/*
			set/get/exists/expire/ttl
		 */
		jedis.set("name","Jack");
		System.out.println(jedis.get("name"));

		System.out.println(jedis.exists("name"));
		System.out.println(jedis.exists("age"));

		jedis.expire("name",10);
		Long ttl = -1L ;
		while(-2 != ttl){
			ttl = jedis.ttl("name") ;
			System.out.println("ttl = " + ttl);

			TimeUnit.SECONDS.sleep(1);
		}
	}


	@After
	public void close(){
		// TODO: step3. 关闭连接
		if(null != jedis) jedis.close();
	}
}

13-Jedis 客户端之JedisPool 连接池


Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此推荐大家使用JedisPool连接池代替Jedis的直连方式。

redis ADDSLOTS 多个slot redis 多个库_学习_24

package cn.itqzd.redis;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * Jedis API 操作Redis数据库中数据,进行CRUD
 */
public class JedisPoolTest {

	// 定义Jedis变量
	private Jedis jedis = null ;

	// 初始化
	@Before
	public void open(){
		// TODO: step1. 获取连接
		// 1-1. 配置
		JedisPoolConfig config = new JedisPoolConfig();
		// 连接池中总的连接数
		config.setMaxTotal(8);
		// 表示连接池中最小有几个连接空闲
		config.setMinIdle(3);
		// 表示连接池最多有几个连接空闲
		config.setMaxIdle(8);
		// 1-2. 连接池
		JedisPool jedisPool = new JedisPool(config, "node1", 6379) ;
		// 1-3. 获取连接
		jedis = jedisPool.getResource();
	}


	@Test
	public void testString(){
		/*
			set/get/exists/expire/ttl
		 */
		jedis.set("name", "Lucy");
		System.out.println(jedis.get("name"));

		System.out.println("name exists: " + jedis.exists("name"));
		System.out.println("age exists: " + jedis.exists("age"));

		jedis.expire("name", 10);
		System.out.println(jedis.ttl("name"));
	}


	@After
	public void close(){
		// TODO: step3. 关闭连接,释放资源
		if(null != jedis) jedis.close();
	}

}