• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Redis入门教程详解

    Redis

    Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库、缓存和消息代理。Redis提供数据结构,如strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams.。Redis具有内置复制、Lua脚本、LRU eviction、事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster的自动分区提供高可用性。

    一、Redis基本数据结构

    1. 字符串 (String)

    字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这意味着该类型可以接受任何格式的数据,如JPEG图像数据或json对象描述信息等。在Redis中字符串类型的value最多可以容纳的数据长度是512M。

    常用命令:

    注意:

    1.字符串append命令会使用更多的内存

    2.整数共享:如果能使用整数,就尽量使用整数

    3.整数精度问题:redis能保证16位精度,17-18位的大整数就会丢失精度

    2. 散列(hash)

    Redis中Hash类型可以看成句又String key和String value的map容器。所以该类型非常适合存储对象的信息。

    常用命令:

    3. 列表(list)

    在Redis中,List类型是按照插入顺序排序的字符串链表。和数据库结构中的普通链表一样,可以在头部和尾部添加新的元素。在插入时如果键不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也会被从数据库中删除。

    常用命令:

    4. 集合(Set)

    Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。集合中最大的成员数为 2^32 - 1

    常用命令:

    5. 有序集合(sorted set)

    Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。

    常用命令:

    二、Redis的高级数据结构

    1. HyperLogLog

    Redis 在 2.8.9 版本添加了 HyperLogLog 结构。Redis HyperLogLog是用来做基数统计的算法,HyperLogLog的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。不过这个是估算,有一定的误差。

    基数计算指的是统计一批元素中不重复元素的个数,比如UV的统计。实现基数统计最常见的是用Set这种数据结构。但是大数据量下Set会占用很大的存储空间。

    常用命令:

    2. GEO

    Redis GEO主要用于存储地理位置信息,并对其进行操作。该功能在Redis3.2版本增加

    常用命令:

    m【米】 km【千米】 ft【英尺】 mi【英里】

    3. BitMap

    BitMap的原理上一篇已经讲过了,它可以用作大数据量的存储,不过存储的内容只能是0或1. 可以使用在10亿用户的在线状态,1代表在线,0代表离线。

    value值只能是0、1

    三、Redis 高级特性

    1. Redis事务

    Redis的事务与数据库的事务概念不同,Redis会将一个事务中的所有命令序列化,然后按顺序执行。Redis不可能在一个Redis事务的执行过程中插入执行另一个客户端发出的请求,事务中任意命令失败不影响其他命令的执行,也不会回滚。

    2. 发布订阅

    发布订阅是一种通信模式,发送者发送消息,订阅者接受消息。客户端可以订阅多个频道,然后有新消息发送给频道,订阅该频道的客户端就都能收到消息。

    常用命令:

    3. 脚本

    Redis 脚本通过Lua解释器来执行脚本,Redis 2.6 版本通过内嵌支持Lua环境

    基本语法如下:
    EVAL script numkeys key [key ...] arg [arg ...]

    例子:

    EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
    

    4. Redis Stream

    Redis Stream是5.0版本新增的数据结构。Redis Stream主要用于消息队列,Redis本身有一个发布/订阅功能,但是它有一个缺点,消息没有持久化,如果网络中断或宕机,数据就会丢失。

    Redis Stream提供了消息的持久化和主备复制功能,它有一个消息链表,把所有加入的消息都串起来,每个消息都有唯一的ID和内容。

    常用命令:

    xadd mystream * name sa surname occc (*代表id由redis生成)

    xrange mystream - + (- 代表最小值,+ 代表最大值)

    从头开始消费:

    xgroup create mystream consumer-group-name 0-0

    从尾部开始消费,只接受新消息

    xgroup create mystream consumer-group-name $

    XREADGROUP GROUP consumer-group-name consumer-name COUNT 1 STREAMS mystream

    第二个group :消费组名
    consumer: 消费者名
    count :读取数量
    milliseconds : 阻塞毫秒数
    key :队列名
    ID:消息id

    四、Redis使用场景

    1. 业务数据缓存

    1.通用数据缓存:String、list

    2.等会话缓存、token、session缓存

    2. 业务数据处理

    1.非严格一致性要求的数据

    2.业务操作去重:订单处理的幂等校验业务数据排序

    3. 全局一致计数

    1.全局流控

    2.秒杀时库存计算

    3.全局ID生成

    4. 高效统计计数

    1.id、ip等使用bitmap操作

    2.使用HyperLogLog进行UV、PV等非精确性的统计

    5. 发布订阅与Stream

    用于消息发布订阅模式

    6. 分布式锁

    1.获取锁

    set key my_random_value NX PX 30000
    

    2.释放锁,需要用到lua脚本保证原子性

    if redis.call("get",KEYS[1])==ARGV[1] then
       return redis.call("del",KEYS[1])
    else
      return 0
    end

    五、Redis的Java客户端

    1. Jedis

    基于BIO、线程不安全,需要配置连接池管理连接

    2. Lettuce

    目前主流推荐的驱动,基于Netty NIO,API线程安全

    3. Redission

    基于Netty NIO,API线程安全。大量丰富的分布式功能,如分布式的基本数据类型和锁。

    六、项目集成

    1. SpringMvc项目可以引入Spring data redis

    maven依赖

    dependency>
                groupId>org.springframework.data/groupId>
                artifactId>spring-data-redis/artifactId>
                version>2.1.2.RELEASE/version>
    /dependency>

    核心是RedisTemplate(可以配置基于Jedis、Lettuce、Redisson),封装了基本的redis命令。

    2. SpringBoot接入(默认使用的Lettuce)

    dependency>
    			groupId>org.springframework.boot/groupId>
    			artifactId>spring-boot-starter-data-redis/artifactId>
    /dependency>

    配置spring.redis

    如:spring.redis.host=127.0.0.1

    3. Spring Cache 集成Redis

    1.启用Spring Cache

    @EnableCaching

    2.方法上添加缓存注解

     @Override
        @Cacheable(value = "userCache")
        public User getUser(Integer id) {
            return userMapper.getUser(id);
        }

    3.配置redisCache

    @Configuration
    public class CacheConfig {
    
        @Bean
        public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
            return RedisCacheManager.create(redisConnectionFactory);
        }
    }

    番外:

    1.Redis到底是单线程,还是多线程?

    这个问题有坑。首先Redis作为一个进程来讲是多个线程的。比如Redis通过多线程方式在后台删除对象、以及通过 Redis模块实现的阻塞命令等.单线程的地方在于探测哪个接收完了请求数据->数据处理->返回数据。而其他耗时操作是用了其他线程。

    探测哪个客户端的请求接受完了,使用的是IO多路复用模型,“多路”是指多个网络连接,“复用”是复用同一个线程。

    2.为什么IO模块在Redis6之前是单线程?

    因为Redis是基于内存的操作,CPU不是瓶颈,瓶颈在于机器内存的大小或网络带宽。
    3. Redis6之后的多线程是什么?

    IO模型使用了多线程的NIO模型,内存处理线程也还是单线程。

    以上就是Redis详解的详细内容,更多关于Redis的资料请关注脚本之家其它相关文章!

    您可能感兴趣的文章:
    • 详解Redis数据类型实现原理
    • redis的五大数据类型应用场景分析
    • Redis底层数据结构详解
    上一篇:详解Redis数据类型实现原理
    下一篇:16个Redis的常见使用场景
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Redis入门教程详解 Redis,入门教程,详解,Redis,