Redis快速入门

初识Redis

  • Redis是一款非关系型,非结构化,无关联,非SQL的数据库。
  • 采用键值对的形式存储数据,value支持多种不同数据结构,功能丰富
  • 单线程,每个命令具备原子性(Redis6.0多线程仅仅实在网络请求处理这块,而核心的命令依然是单线程)
  • 低延迟,速度快(基于内存,io多路复用,良好的编码)
  • 支持数据持久化(定期将内存中的数据持久化到磁盘)
  • 支持主从集群,分片集群
  • 支持多语言客户端

Redis常见命令

五种常见的数据结构及命令

各种数据类型的特点图解

image.png

String类型

String类型,也就是字符串类型,时Redis中最简单的存储类型
value是字符串,不过根据字符串的格式不同,又可以分为三类:

  • string:普通字符串
  • int:整数类型,可以做自增,自减操作
  • float:浮点类型,可以做自增,自减操作

不管是那种格式,底层都是字节数组,只是编码方式不同,字符串类型的最大空间不超过512m

String类型的常见命令
SET key value:              设置指定key的值
GET key:                    获取key的值                
SETNX key value:            只有在key不存在时设置key的值
SETEX key seconds value:    设置指定key的值,并将key的过期时间设置为seconds秒

key的结构

Reids的key允许有多个单词形成层级结构。多个单词之间使用 : 隔开
这个格式并非固定,可以根据自己的需求来删除或添加
例如项目coda中有角user 和emp 的两种不同类型数据,可以这样定义key:

  • user相关的key:coda:user:1
  • emp相关的key:coda:emp:1

然后在对应的value中就可java对象,使用json存储

  • coda:user:1 {“id”:1,“name” :“jack”}
  • coda:user:1 {"id"1,“name”:“tom”}

Hash类型

Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构
Hash结构可以将对象中的每个字段独立存储,可以针对于单个字段CRUD

Hash类型的常见命令
HSET key field value          将哈希表key中的字段
HGET key field 				  获取存储在哈希表中指定字段的值
HDEL key field 				  删除存储在哈希表中的指定字段
HKEYS key					  获取哈希表中所有字段
HVALS key					  获取哈希表中所有的值

List列表类型

存储数据时按照插入的顺序排列,可以有重复的元素,类似于Java中的LinkList,先进后出

  • 有序
  • 元素可以重复
  • 插入和删除快
  • 查询速度一般

通常用来存储有序的数据,例如:朋友圈点赞列表,评论列表等

List列表类型常见命令
LPUSH key value1 [value2]  			从左边插入一个或多个值
RPUSH key value1 [value2]  			从右边边插入一个或多个值
LRANGE key start stop  				获取列表指定范围内的元素
RPOP key							移除并获取列表最后一个元素
LLEN key							获取列表长度

Set集合类型

Redis set是string类型的无序集合,集合成员是唯一的,集合中不能出现重复的元素
与Java中的HashSet类似,可以看作是一个value为null的HashMap,因为底层数据结构也是哈希表,具备HashSet类似的特征

  • 无序
  • 元素不可重复
  • 查找快
  • 支持交集,并集,差集等功能
Set集合类型的常用命令
SADD key member1 [member2]				向集合添加一个或多个成员
SMEMBERS key							返回集合中的所有元素
SCARD key								获取集合的成员数量
SINTER key1 [key2]						返回给定所有集合的交集
SUNION key1 [key2]						返回所有给定集合的并集
SREM key member1 [member2]				删除集合中一个或多个成员

SortedSet有序集合类型

Reids有序集合是string类型的元素集合。SortedSet是一个可以排序的set集合,与java中的TreeSet类似,但底层数据结构差别很大。SortSet中的每个元素都带有一个score属性,可以基于该属性对元素排序,底层实现是一个跳表加哈希表。

  • 可以排序
  • 元素不重复
  • 查询速度快

因为SortedSet的可排序性,经常被用来实现排行榜这类的功能

SortedSet有序集合常用命令
ZADD key score1 member1 [score2 member2]		向有序集合添加一个或者多个元素
ZRANGE key start stop [WITHSCORES]				通过索引区间返回有序集合中指定区间内的元素
ZINCRBY key increment member				    有序集合中对指定成员的分数加上增量increment
ZREM key member [member...]					    移除有序集合中的一个成员或多个成员

通用命令

通用命令是部分数据数据类型的,都可以使用的命令

KEYS pattern                     查看符合模板的所有key
DEL key                          删除指定key,返回删除的数量
ESISTS key                       判断key是否存在
EXPIRE key 有效时间               给一个key设置有效期,有效期到期时key就会自动删除
TTL key                          查看一个key的剩余有效期
TYPE key						 返回key所存储的值的类型

Redis的Java客户端

以下操作都是基于Springboot框架
Redis的Java客户端很多,常见的有以下几种

  • Jedis
  • Lettuce
  • Spring Data Redis

Spring Data Redis 是Spring的一部分,对于Redis底层开发进行了高度封装
在Spring项目中,可以使用Spring Data Redis 来简化操作

Jedis客户端

以Redis命令作为方法名称,学习成本低,使用简单,但是Jedis实列是线程不安全的,多线程环境下需要基于连接池来使用

操作步骤

  • 导入Jedis的maven坐标
  • 创建Jedis对象建立连接
导入maven坐标
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.7.0</version>
</dependency>

在测试类中测试Redis常用方法
@SpringBootTest
class UpdateFileApplicationTests {
    private Jedis jedis;
    @Test
    void testJedis() {
        //建立连接
        jedis = new Jedis("localhost", 6379);
        //设置密码,没有密码不需要写
        //jedis.auth("1234");
        //选择存储库
        jedis.select(0);

        //插入数据,方法名就是redis命令名称,其他数据结构操作方法也是类似
        jedis.set("name", "zhangsan");
        //获取数据
        String name = jedis.get("name");
        System.out.println(name);   //zhangsan

        //释放资源
        if (jedis!=null){
            jedis.close();
        }
    }
}

Jedis连接池

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

定义工具类JedisConnectionFactory
public class JedisConnectionFactory {
    private static final JedisPool JEDIS_POOL;

    static {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();

        //最大连接
        jedisPoolConfig.setMaxTotal(8);
        //最大空闲连接
        jedisPoolConfig.setMaxIdle(8);
        //最小空闲连接
        jedisPoolConfig.setMinIdle(0);
        //设置最长等待时间 ms
        jedisPoolConfig.setMaxWaitMillis(200);
         //创建连接池对象
        JEDIS_POOL = new JedisPool(jedisPoolConfig,"localhost",6379,100,"password");
    }

    //获取jedis对象
    public static Jedis getJedis(){
        return JEDIS_POOL.getResource();
    }
}

在测试类中使用Jedis连接池
@SpringBootTest
class UpdateFileApplicationTests {
    private Jedis jedis;
    @Test
    void testJedis() {
        //建立连接,使用工具类创建连接池
        jedis = JedisConnectionFactory.getJedis();
        //设置密码,没有密码不需要写
        //jedis.auth("1234");
        //选择存储库
        jedis.select(0);

        //插入数据,方法名就是redis命令名称,其他数据结构操作方法也是类似
        jedis.set("name", "zhangsan");
        //获取数据
        String name = jedis.get("name");
        System.out.println(name);   //zhangsan

        //释放资源
        if (jedis!=null){
            jedis.close();
        }
    }
}

SpringDataRedis客户端

SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中Redis的集成叫SpringDataRedis

  • 提供了不同Reids客户端的整合
  • 提供了对不同RedisTemplate统一API来操作Redis
  • 支持Redis的发布订阅模型
  • 支持Redis哨兵和Reids集群
  • 支持基于Lettuce的响应式编程
  • 支持基于JDk,JSON,字符串,Spring对象的数据序列化以及反序列化
  • 支持基于Redis的JDKCollection实现

RedisTemplate常用API

SpringDataReids中提供了RedisTemplate工具类,其中封装了对Redis的操作。并将不同数据类型的操作API,封装到了不同类型中。
image.png

操作步骤

  1. 导入Spring Data Redis的maven坐标
  2. 配置Redis数据源
  3. 编写配置类,创建RedisTemplate对象
  4. 通过ReidsTemplate对象操作Redis
导入maven坐标
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

配置Redis数据源
  • 在配置文件yml中配置
  • 配置连接池pool
spring:
 redis:
   host: localhostj
   port: 6379
   password: 12233
   lettuce:
     pool:
       max-active:8
       max-idle: 8
       min-idle: 0
       max-wait: 100ms

编写配置类,创建RedisTemplate对象
  • 设置连接工厂对象
  • 设置key的序列化器
Configuration
@Slf4j
public class RedisConfiguration {
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
        log.info("开始创建redis模板对象");
        RedisTemplate redisTemplate = new RedisTemplate();
        //设置redis的连接工厂对象
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //设置redis  key的序列化器
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

在测试类中测试redis的常用方法
  • 获取各种数据类型的常见方法
  • 获取对应数据类型后,常见的操作方法
@SpringBootTest
public class SpringDataRedis {
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 创建常用操作的数据类型
     */
    @Test
    public void testRedis(){
        //通过RedisTemplate,可以很方便地执行字符串、哈希、列表、集合以及有序集合等Redis数据结构的相关操作。
        ValueOperations valueOperations = redisTemplate.opsForValue();
        HashOperations hashOperations = redisTemplate.opsForHash();
        ListOperations list = redisTemplate.opsForList();
        SetOperations set = redisTemplate.opsForSet();
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
    }
    /**
     * 操作字符串类型的数据
     */
    @Test
    public void testSpring(){
        //在redis中插入Spring类型的数据
        //设置key:vale
        redisTemplate.opsForValue().set("name","zhangsan");
        //根据key得到value
        String name = (String) redisTemplate.opsForValue().get("name");
        System.out.println(name);

        //设置key有效期,60秒
        redisTemplate.opsForValue().set("age","23",60, TimeUnit.SECONDS);

        //设置key,不存在添加,存在不添加
        redisTemplate.opsForValue().setIfAbsent("city","nanchang");
    }

    /**
     * 操作Hash类型的数据
     */
    @Test
    public void testHash(){
        //在redis中插入Hash类型的数据
        HashOperations hashOperations = redisTemplate.opsForHash();
        hashOperations.put("100","name","zhangsan");
        hashOperations.put("100","age","23");
        hashOperations.put("100","gender","nan");

        //获取value
        String name = (String) hashOperations.get("100", "name");
        String age = (String) hashOperations.get("100", "age");
        String gender = (String) hashOperations.get("100", "gender");

        //删除
        hashOperations.delete("100","gender");

        //获取所有key
        Set keys = hashOperations.keys("100");
    }

    /**
     * 操作列表类型的的数据
     */
    @Test
    public void testList(){
        ListOperations listOperations = redisTemplate.opsForList();

        //插入多条列表数据
        listOperations.leftPushAll("myList","a","b","c");
        //插入单条列表数据
        listOperations.leftPush("myList","d");

        //获取列表数据
        List myList1 = listOperations.range("myList", 0, -1);

        //移除并获取列表最右端的元素
        String pop = (String) listOperations.rightPop("myList");

        //获取列表的长度
        Long myList = listOperations.size("myList");
    }

    /**
     * 操作集合类型的数据
     */
    @Test
    public void testSet(){
        SetOperations setOperations = redisTemplate.opsForSet();

        //插入set集合
        setOperations.add("set1","a","b","c","d");
        setOperations.add("set2","a","b","x","y");

        //获取集合中的元素
        Set set1 = setOperations.members("set1");

        //获取集合的长度
        Long size = setOperations.size("set1");

        //获取集合的交集部分
        Set intersect = setOperations.intersect("set1", "set2");

        //获取集合并集部分
        Set union = setOperations.union("set1", "set2");

         //移除集合中指定元素
        setOperations.remove("set1","a","b");
    }

    /**
     * 通用命令
     */
    @Test
    public void common(){
        //查询所有key
        Set keys = redisTemplate.keys("*");

        //查询某个key是否存在
        Boolean set1 = redisTemplate.hasKey("set1");

        //查询某个key的类型
        DataType type = redisTemplate.type("set1");
        
        //删除key
        redisTemplate.delete("set1");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值