Redis个人文档(1)

Redis官网

Redio-UI

Redis的基本安装

Linux下安装(CentOS7)

  1. 下载gcc依赖
  2. 上传安装包并解压(/usr/local/src)
  3. 进入redis目录
  4. 编译
yum install -y gcc tcl

# 此处上传redis文件
tar -xzf redis-6.2.6.tar.gz

cd redis-6.2.6
make && make install

Redis 客户端(windows)

Redio-UI

在连接时先写好redis的基本配置

安装完成后运行即可


Redis的基本配置文件

# 允许访问的地址,默认是127.0.0.1,会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问,生产环境不要设置为0.0.0.0
bind 0.0.0.0
# 守护进程,修改为yes后即可后台运行
daemonize yes 
# 密码,设置后访问Redis必须输入密码
requirepass 123321

# 监听的端口
port 6379
# 工作目录,默认是当前目录,也就是运行redis-server时的命令,日志、持久化等文件会保存在这个目录
dir .
# 数据库数量,设置为1,代表只使用1个库,默认有16个库,编号0~15
databases 1
# 设置redis能够使用的最大内存
maxmemory 512mb
# 日志文件,默认为空,不记录日志,可以指定日志文件名
logfile "redis.log"

Redis命令行客户端

# 利用redis-cli来执行 shutdown 命令,即可停止 Redis 服务,
# 配置了密码,需要通过 -u 来指定密码
redis-cli -u 123321 shutdown

# 进入redis安装目录 
cd /usr/local/src/redis-6.2.6
# 启动
redis-server redis.conf
redis-cli [options] [commonds]

-h 127.0.0.1:指定要连接的redis节点的IP地址,默认是127.0.0.1
-p 6379:指定要连接的redis节点的端口,默认是6379
-a 123321:指定redis的访问密码

ping 心跳测试

也可以直接登录,在页面内通过AUTH指定密码
AUTH 4285

Redis常见的数据结构和相关命令

基本命令的帮助文档

通用命令

  • *为通配符
  1. keys Pattern 查看符合模板的所以key
  2. del keyName 删除指定keyname,多个用空格隔开
  3. exists KeyName 查询制定key是否存在
  4. expire KeyName seconds 给某个key指定一个有效期
  5. ttl KeyName 查询一个key的有效时间(-1是永久有效 , -2是已过期)

key的层级结构

Redis的Key允许有多个单词组成的层级结构,多个单词之间用:隔开,如

项目名:业务名:类型:id

这个格式并非固定,也可以根据自己的需求来删除或添加词条。这样以来,我们就可以把不同类型的数据区分开了。
从而避免了key的冲突问题。

例如我们的项目名称叫 heima,有user和product两种不同类型的数据,我们可以这样定义key:

user相关的key:heima:user:1
product相关的key:heima:product:1
  • 基本类型

String

细分的类型
String普通字符串
int整数型
float浮点型

redisString1.png

Hash

散列,其value是一个无序字典,类似与java中的HaspMap结构

RedisHash1.png

RedisHash2.png

List

近似双向链表结构,既可以支持正向检索也可以支持反向检索

特征:

  1. 有序
  2. 元素可以重复
  3. 插入和删除快
  4. 查询速度一般

RedisList.png

  • BLPOP阻塞式获取,会有一个等待的时间
  • 可以用List结构模拟有栈(出入口在同一边) , 模拟一个队列(出入口不在同一边), 阻塞队列(出入口不在同一边,并且有阻塞时间)

Set

与HaskSet类似,本质也是一个Hask表

特征:

  1. 无序
  2. 元素不可以重复
  3. 支持交集,并集,差集等功能
  4. 查询快

RedisSet1.png

逻辑命令(多集合操作):

RedisSet2.png

SortedSet

可以排序的Set集合,可以通过score属性对元素进行排序,底层是跳表加hash表

sortedSet.png

注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可,例如:

升序获取sorted set 中的指定元素的排名:ZRANK key member
降序获取sorted set 中的指定元素的排名:ZREVRANK key memeber

  • 特殊的数据类型
  1. GEO(地理坐标)
  2. BitMap(位存储)
  3. HyperLog

Redis的Java客户端

Jedis ,以Redis命令做方法名称 , 但Jedis实例的线程是不安全的

主流用Lettuce , 基于Netty

Spring Data Redis => 同时兼容Jedis 和 Lettuce(在学习分布式锁时细)

Jedis

引入maven依赖

<dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>4.3.1</version>
</dependency>

建立Jedis连接

void setup(){
        //建立连接
        jedis = new Jedis("121.41.54.154" , 6379);
        //设置密码
        jedis.auth("4285");
        //选择库
        jedis.select(0);
        
        //编写Redis语句
        String result = jedis.set("name", "cosh");
        System.out.println("result = " + result);
        String name = jedis.get("name");
        System.out.println(name);
        if(jedis != null) jedis.close();
}

Jedis的命令全是基于Redis的命令来写的,直接根据Java提示来写既可

Jedis连接池配置文件:

public class Pool {
    private static final JedisPool jedispool;

    static {
        //配置连接池
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        //最大连接数量
        poolConfig.setMaxTotal(8);
        //最多预备8个连接
        poolConfig.setMaxIdle(8);
        //最少预备连接
        poolConfig.setMinIdle(2);
        //等待时长
        poolConfig.setMaxWaitMillis(1000);
        //创建连接池对象
        jedispool = new JedisPool(poolConfig , "121.41.54.154" , 6379 , 1000 , "4285");
    }

    public static Jedis getJedis() {
        return jedispool.getResource();
    }
}

获取连接池的连接和归还连接

//获取连接
jedis = Pool.getJedis();

//关闭连接
jedis.close();                                                                                                          

Spring Data Redis

SpringRedis1.png

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

application.yml设置:

spring:
  redis:
    host: 121.41.54.154
    port: 6379
    password: 4285
    lettuce:
      pool:
        max-active: 8 # 最大连接数量
        max-idle: 8 # 最大空闲连接
        min-idle: 2 # 最小空闲连接
        max-wait: 100 # 最长等待时间

编写测试类:

    @Resource
    RedisTemplate redisTemplate;
    @Test
    void contextLoads() {
        redisTemplate.opsForValue().set("name" , "newCosh");
        Object name = redisTemplate.opsForValue().get("name");
        System.out.println(name);
    }

Redis序列化

由于SpringData在传入参数时会以字节化的形式传入,这时候传入时会默认转化成二进制文件

修改值的序列化:

建立一个Configuration(白学警告)

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        //创建RedisTemplate对象
        RedisTemplate<String , Object> template = new RedisTemplate<>();
        //设置连接工厂
        template.setConnectionFactory(connectionFactory);
        //设置Key序列化
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        //设置Value序列化
        template.setValueSerializer(RedisSerializer.json());
        template.setHashValueSerializer(RedisSerializer.json());
        //返回
        return template;
    }
}

在序列化中消除@class进入json串的构造,此时需要手动完成序列化和反序列化

此时可以借助SpringBoot自带的工具类完成转换

@Autowired
    private StringRedisTemplate redisTemplate;

    @Test
    void contextLoads() {
        redisTemplate.opsForValue().set("name:1:aaa" , JSON.toJSONString(new TestClass("123" , "123")));
    }
文章作者: cosh
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 cosh'blog
Others
喜欢就支持一下吧