走进舒适圈の小窝

Loading...

Redis

简介

  Redis(Remote Dictionary Server)是一个开源的内存数据库,遵守 BSD 协议,它提供了一个高性能的键值(key-value)存储系统,常用于缓存、消息队列、会话存储等应用场景

特点

  • 丰富的数据类型:Redis 不仅仅支持简单的 key-value 类型的数据,还提供了 list、set、zset(有序集合)、hash 等数据结构的存储

  • 高性能的读写能力:Redis 能读的速度是 110000次/s,写的速度是 81000次/s

  • 原子性操作:Redis 的所有操作都是原子性的,这意味着操作要么完全执行,要么完全不执行

  • 持久化机制:Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,以便在系统重启后能够再次加载使用

  • 单线程模型:Redis 是单线程的,但它通过高效的事件驱动模型来处理并发请求,确保了高性能和低延迟

命令

服务器相关

  • ping : 检测连接是否存活

  • echo: 在命令行打印一些内容

  • quit、exit: 退出客户端

  • shutdown: 退出服务器端

  • info: 返回redis相关信息

  • showlog: 显示慢查询

  • select n: 切换到数据库n,redis默认有16个数据库(DB 0~DB 15),默认使用的第0个

  • dbsize: 查看当前数据库大小

  • move key n: 不同数据库之间数据是不能互通的,move移动键到指定数据库

  • flushdb: 清空当前数据库中的键值对。

  • flushall: 清空所有数据库的键值对。

Key相关命令

  • keys *:查看当前数据库中所有的key

  • dbsize: 键总数

  • exists key: 检查键是否存在

  • del key [key …]: 删除键

  • expire key seconds: 键过期

  • ttl key: 获取键的有效时长

  • persist key: 移除键的过期时间

  • type key: 键的数据结构类型

  • randomkey: 随机返回数据库中一个键

  • rename key1 key2 : 重命名

  • renamex key1 key2 : 当key2不存在时,key1重命名

String相关命令

String类型是redis中最基本的数据类型,是二进制安全的,可以存储任何类型的数据,如:图片或者序列化的对象;在Redis中,String类型内部结构相当于java中的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配

用途:可以用来统计微博数、粉丝数量、图片编码后的存储

  • set key value: 设置一个key的value值

  • setnx key value: 仅当key不存在时进行set

  • setex key seconds value: set 键值对并设置过期时间

  • mset key value [key value …]: 设置多个key value

  • msetnx key1 value1 [key2 value2…]: 批量设置键值对,仅当参数中所有的key都不存在时执行,原子性操作,一起成功,一起失败

  • get key: 返回key的value

  • mget key [key …] : 批量获取多个key保存的值

  • exists key [key …]: 查询一个key是否存在

  • decr/incr key: 将指定key的value数值进行+1/-1(仅对于数字)

  • incrby/decrbyB key n: 按指定的步长对数值进行加减

  • incrbyfloat key n: 为数值加上浮点型数值

  • append key value: 向指定的key的value后追加字符串

  • strlen key: 返回key的string类型value的长度。

  • getset key value: 设置一个key的value,并获取设置前的值,如果不存在则返回null

  • setrange key offset value: 设置指定位置的字符

  • getrange key start end: 获取存储在key上的值的一个子字符串

Hash相关命令

Redis Hash是一个String类型的filed(字段)和value(值)的映射表,特别适合存储对象

用途:用户数据的管理,存储用户的信息;也可以作为高并发场景下使用Redis生成唯一的 id

  • hset key field value: 将哈希表 key 中的字段 field 的值设为 value。重复设置同一个field会覆盖,返回0

  • hmset key field1 value1 [field2 value2…]: 同时将多个 field-value (域-值)对设置到哈希表 key 中。

  • hsetnx key field value: 只有在字段 field不存在时,设置哈希表字段的值。

  • hget key field value: 获取存储在哈希表中指定字段的值

  • hmget key field1 [field2…]: 获取所有给定字段的值

  • hexists key field: 查看哈希表 key 中,指定的字段是否存在。

  • hdel key field1 [field2…]: 删除哈希表key中一个/多个field字段

  • hlen key: 获取哈希表中字段的数量

  • hkeys key: 获取所有字段field

  • hvals key: 获取哈希表中所有值value

  • hgetall key: 获取在哈希表key 的所有字段和值

  • hincrby key field n: 为哈希表 key 中的指定字段的整数值加上增量n,并返回增量后结果 一样只适用于整数型字段

  • hincrbyfloat key field n: 为哈希表 key 中的指定字段的浮点数值加上增量 n。

  • hscan key cursor [MATCH pattern] [COUNT count]: 迭代哈希表中的键值对。

List相关命令

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者
尾部(右边)

用途:历史记录、分页数据

添加操作

  • lpush/rpush key value1[value2…]: 从左边/右边向列表中PUSH值(一个或者多个)

  • lpushx/rpushx key value: 向已存在的列名中push值(一个或者多个),list不存在 lpushx失败

  • linsert key before|after pivot value: 在指定列表元素的前/后 插入value

查找操作

  • lindex key index: 通过索引获取列表元素

  • lrange key start end: 获取list 起止元素 (索引从左往右 递增)

  • llen key: 查看列表长度

删除操作

  • lpop/rpop key: 从最左边/最右边移除值 并返回

  • lrem key count value: count >0:从头部开始搜索 然后删除指定的value 至多删除count个 count < 0:从尾部开始搜索… count = 0:删除列表中所有的指定value。

  • ltrim key start end: 通过下标截取指定范围内的列表

  • rpoplpush source destination: 将列表的尾部(右)最后一个值弹出,并返回,然后加到另一个列表的头部

修改操作

  • lset key index value: 通过索引为元素设值

阻塞操作

  • blpop/brpop key1[key2] timout: 移出并获取列表的第一个/最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

  • brpoplpush source destination timeout: 和rpoplpush功能相同,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

Set相关命令

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
(存储无序、并且不希望出现重复数据的时候使用set比较合适)

底层是通过HashSet实现

用途:去重、抽奖、共同好友、二度好友

集合内操作

  • sadd key member1[member2…]: 向集合中无序增加一个/多个成员

  • srem key member1[member2…]: 移除集合中一个/多个成员

  • scard key: 获取集合的成员数

  • smembers key: 返回集合中所有的成员

  • sismember key member: 查询member元素是否是集合的成员,若存在返回1,不存在返回0

  • srandmember key [count]: 随机返回集合中count个成员,count缺省值为1

  • spop key [count]: 随机移除并返回集合中count个成员,count缺省值为1

集合间操作

  • sinter key1 [key2…]: 返回所有集合的交集

  • sinterstore destination key1[key2…]: 在SINTER的基础上,存储结果到集合中。覆盖

  • sunion key1 [key2…]: 返回所有集合的并集

  • sunionstore destination key1 [key2…]: 在SUNION的基础上,存储结果到及和张。覆盖

  • sdiff key1[key2…]: 返回所有集合的差集 key1- key2 - …

  • sdiffstore destination key1[key2…]: 在SDIFF的基础上,将结果保存到集合中。覆盖

  • smove source destination member: 将source集合的成员member移动到destination集合

  • sscan key [MATCH pattern] [COUNT count]: 在大量数据环境下,使用此命令遍历集合中元素,每次遍历部分

Zset相关命令(重点)

  • Redis 有序集合和SET集合一样也是 string 类型元素的集合,且不允许重复的成员

  • 不同的是Zset中的每个元素都会关联一个double类型的Score(分数),Redis正是通过分数来为集合中的成员进行排序的

  • 有序集合中成员是唯一的,但是Score(分数)是可以重复的

  • 底层是通过SortedSetHashMap实现的

用途:实现排序类型的业务,如:首页推荐10个最热门的帖子,阅读量由高到低,排行榜的实现

集合内

  • zadd key score member1 [score2 member2]: 向有序集合添加一个或多个成员,或者更新已存在成员的分数

  • zcard key: 获取有序集合的成员数

  • zscore key member: 返回有序集中,成员的分数值

  • zcount key min max: 计算在有序集合中指定区间score的成员数

  • zlexcount key min max: 在有序集合中计算指定字典区间内成员数量

  • zincrby key n member: 有序集合中对指定成员的分数加上增量 n

  • zscan key cursor [MATCH pattern] [COUNT count]: 迭代有序集合中的元素(包括元素成员和元素分值)

范围查询

  • zrank key member: 返回有序集合中指定成员的索引

  • zrevrank key member: 返回有序集合中指定成员的索引,从大到小排序

  • zrange key start end: 通过索引区间返回有序集合成指定区间内的成员

  • zrevrange key start end: 通过索引区间返回有序集合成指定区间内的成员,分数从高到底

  • zrangebylex key min max: 通过字典区间返回有序集合的成员

  • zrevrangebylex key max min: 按字典顺序倒序返回有序集合的成员

  • zrangebyscore key min max: 返回有序集中指定分数区间内的成员 -inf 和 +inf分别表示最小最大值,只支持开区间

  • zrevrangebyscore key max min: 返回有序集中指定分数区间内的成员,分数从高到低排序

删除操作

  • zrem key member1 [member2…]: 移除有序集合中一个/多个成员

  • zremrangebylex key min max: 移除有序集合中给定的字典区间的所有成员

  • zremrangebyrank key start stop: 移除有序集合中给定的排名区间的所有成员

  • zremrangebyscore key min max: 移除有序集合中给定的分数区间的所有成员

集合间操作

  • zinterstore destination numkeyskey1 [key2 …]: 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中,numkeys:表示参与运算的集合数,将score相加作为结果的score

  • zunionstore destination numkeys key1 [key2…]: 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中

Java 连接 Redis

  • 先导入依赖
  <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>5.1.0</version>
  </dependency>
  • 连接Redis
import redis.clients.jedis.Jedis;

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello world!");
        Jedis jedis = new Jedis("192.168.200.101",6379);
        System.out.println("连接成功");
        jedis.set("key", "value");
        System.out.println("key的值:" + jedis.get("key"));
    }
}

Redis 锁机制

分布式锁

控制分布式系统不同进程共同访问共享资源的一种锁的实现。如果不同的系统或同一个系统的不同主机之间共享了某个临界资源,往往需要互斥来防止彼此干扰,以保证一致性。

NoSql

  • 导入依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  • 配置文件 application.yml
spring:
  data:
    redis:
      host: 192.168.200.101
      port: 6379
  • 序列化
@Configuration
public class RedisConfiguration {
    @Bean
    public RedisTemplate<String, Object> redisTemplate
            (RedisConnectionFactory redisConnectionFactory, RedisAccessor redisAccessor) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        redisTemplate.setEnableTransactionSupport(true);
        redisTemplate.setDefaultSerializer(new GenericJackson2JsonRedisSerializer());
        return redisTemplate;
    }
}
  • 测试
@SpringBootTest
class RedisDifferentTemplateTest {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    @Test
    void redisTest(){
        redisTemplate.opsForValue().set("a","1234");
    }
}

  • 传入对象
@Slf4j
@SpringBootTest
class RedisDifferentTemplateTest {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

//    @Resource
//    private StringRedisTemplate stringRedisTemplate;

    @Test
    void redisTest() throws JsonProcessingException {
//        redisTemplate.opsForValue().set("a","1234");
//        redisTemplate.opsForHash().put("hash","key","value");
//        Object o = redisTemplate.opsForValue().get("a");
//        System.out.println(o);
//        redisTemplate.opsForZSet().add("zs1","zs1",1);
//        Long zs1 = redisTemplate.opsForZSet().zCard("zs1");
//        System.out.println(zs1);

        /**
         * ObjectMapper是jackson提供的一个对象和json之间转换的类
         */
        ObjectMapper objectMapper = new ObjectMapper();
        User user = new User();
        user.setName("zs");
        user.setAge(18);
        String s = objectMapper.writeValueAsString(user);
        redisTemplate.opsForValue().set("user",s);
        System.out.println("赋值完成");
        String user1 = (String) redisTemplate.opsForValue().get("user");
        User user2 = objectMapper.readValue(user1, User.class);
        System.out.println(user1);
        System.out.println(user2);
    }
}


posted @ 2025-01-06 00:14  走进舒适圈  阅读(80)  评论(0)    收藏  举报