Redis 内存数据库(仅供学习)

Redis 内存数据库


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

在这里插入图片描述

# 官方网站:
	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/

在这里插入图片描述

  • 下载源码
wget https://download.redis.io/releases/redis-5.0.8.tar.gz
  • 安装依赖

    Redis是基于C语言编写的,因此首先需要安装Redis所需要的gcc依赖:

    yum -y install gcc-c++ tcl
    

    在这里插入图片描述

  • 上传源码

    cd /export/software/
    rz
    	redis-5.0.8.tar.gz
    

在这里插入图片描述

  • 解压
tar -zxvf redis-5.0.8.tar.gz -C /export/server/
  • 编译安装

    # 进入源码目录
    cd /export/server/redis-5.0.8/
    
    # 编译
    make
    

    在这里插入图片描述

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

    在这里插入图片描述

  • 复制配置文件

    cp /export/server/redis-5.0.8/redis.conf /export/server/redis/
    

    在这里插入图片描述

  • 创建目录

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

    在这里插入图片描述

  • 修改配置

    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-cli -h node1 -p 6379
    

    在这里插入图片描述

  • 测试

    在这里插入图片描述

  • 关闭服务

    • 方式一:客户端中
    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的交互控制台:

在这里插入图片描述

图形化桌面客户端

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

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

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

在这里插入图片描述

安装RedisDesktopManager

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

在这里插入图片描述

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

在这里插入图片描述

双击即可运行:

在这里插入图片描述

建立连接

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

点击即可建立连接了:

在这里插入图片描述

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

第二部分:Redis 常见命令

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

04-Redis 数据结构介绍


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

在这里插入图片描述

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

在这里插入图片描述

帮助命令:help

在这里插入图片描述

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

在这里插入图片描述

常用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>
    
  2. 建立连接

    // 建立连接
    Jedis jedis = new Jedis("192.168.88.100", 6379);
    // 选择库
    jedis.select(0);
    
  3. 关闭连接,释放资源

    // 释放资源
    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的直连方式。

在这里插入图片描述

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();
	}

}

  • 23
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值