现在学习Redis还来得及么

Posted 乐哉开讲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了现在学习Redis还来得及么相关的知识,希望对你有一定的参考价值。

现在学习Redis还来得及么(1)

写在前面

本篇文章将带领大家重新认识redis,先从redis的基本数据类型的简单入门使用讲起,再逐步进阶,讲解高级数据类型,学习完高级数据类型之后,将会带着疑问,去学习更加深入的知识。
如何实现分布式锁?
为什么单线程的redis如此快?
redis主从同步的原理和过程是什么样的?
redis如何构建高可用的集群?
这些都是学完redis之后,必知必会的知识,也是面试官必问的。本节内容会围绕这两个目标出发:
    a.帮助大家轻松应对面试。
    b.系统性的学习,不再为了面试而学习。
现在学习Redis还来得及么(1)




开始我们漫长而又充实的阅读吧~



1

环境搭建


现在学习Redis还来得及么(1)
认真听,搭好地基,后面的路才好走

1

Redis 之 Docker方式安装

        

下载redis镜像

  
    
    
  
docker  pull  redis

创建实例并启动

  
    
    
  
mkdir - p /mydata/redis/ conf/
touch /mydata/redis/ conf/redis. conf
docker run - p  6379: 6379 --name redis
-v /mydata/redis/dat a:/data
-v /mydata/redis/ conf/redis. conf:/etc/redis/redis. conf 
-d redis redis-server /etc/redis/redis. conf

编辑配置文件

  
    
    
  
vim /mydata/redis/ conf/redis. conf

## 复制以下内容
daemonize no
pidfile /var/run/redis.pid
port 6379
timeout 0
loglevel verbose
logfile stdout
databases 16
save 900  1
save 300  10
save 60  10000
rdbcompression yes
dbfilename dump.rdb
dir ./
slave-serve-stale-data yes
appendonly yes
appendfsync everysec
no-appendfsync- on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite- min-size 64mb
slowlog- log-slower-than 10000
slowlog- max- len  1024

2

使用源码方式安装redis


下载redis安装包

  
    
    
  
wget http: //download.redis.io/releases/redis-4.0.6.tar.gz

解压压缩包

  
    
    
  
tar  -zxvf  redis-4 .0 .6 .tar .gz

安装gcc依赖

  
    
    
  
yum install gcc


跳转到redis解压目录下

  
    
    
  
cd  redis-4 .0 .6

编译安装

  
    
    
  
make MALLOC=libc

安装

  
    
    
  
cd src && make install

启动redis

  
    
    
  
#切换到src目录下,执行以下命令
./redis-server

连接redis

  
    
    
  
./redis-cli


2

五种基本数据类型的操作与应用场景


现在学习Redis还来得及么(1)
环境搭建好了么,就来了?

1

string 字符串类型


基本指令

  •   添加数据  
  •    
         
         
       
    set  name lezai
  • 删除数据
  •    
         
         
       
    del name
  • 获取数据
        
          
          
        
    get name
  • 整数 自增
        
          
          
        
    # 默认自增1
    incry age
    #自定义自增值
    incrby age -1
  • 单独设置有效期,单位为秒
  •    
         
         
       
    expire name 10
  • 建key的同时设置超时时间
        
          
          
        
    setex name 10 lezai
  • key不存在则创建成功否则创建失败,用来实现分布式锁的基本原理
        
          
          
        
    setnx name lezai

应用场景

缓存、计数器、分布式锁

2

hash(哈希)

现在学习Redis还来得及么(1)
redis中的hash类似于java中的hashmap,里面存储了大量的键值对,底层实现和java的hashmap一样,也是使用数组+链表的结构。
但是hash里面的值都只能是字符串型,而且他们的rehash方式是不一样的,redis的hash并不是一次性将全部的数据进行rehash,而是采用渐进式的方式,也就是说会存在两个相同的结构,等到就得数据全部迁移完成,才会将旧的数据结构删除,使用新的代替。

基本操作指令

  • 添加数据  
  •    
         
         
       
    hset student name lezai age 26
  • 删除数据
  •    
         
         
       
    hdel student name age
  • 获取单个字段
        
          
          
        
    hget student name
  • 获取所有字段
        
          
          
        
    hgetall student
  • 获取map长度
  •    
         
         
       
    hlen student
    自增
        
          
          
        
    hincrby student age 1

应用场景


缓存一个实体对象、购物车

3

list(链表)

redis的链表是一个双向链表,左右两边都可以插入和去除数据,其实redis底层存储的不仅仅是简单的链表结构,而是称之为一个快速列表的结构,在列表元素较少的时候,redis会使用一块连续的内存存储,这个结构是ziplist,成为压缩列表。

当数据内容较多的情况下才会改成quicklist,因为普通列表存储一个内容需要再存储两个额外的指针,很浪费空间,所以在数据量大的时候,才将多个压缩列表使用双向列表链接起来,组成快速列表。

基本操作指令

  • 右边进左边出(先进先出)-队列

  • #添加列表
    rpush datas 1 2 3
    #获取列表长度
    llen datas
    #取出数据
    lpop datas

  • 右边进右边出(先进后出)-栈

  • #添加列表
    rpush datas 1 2 4
    #取出数据
    rpop datas

  • 查询元素

    #获取指定位置的元素(遍历所有元素,底层采用链表结构)
    lindex datas -1[-1代表倒数第一个]
    #查询指定区间元素,以下取出所有数据
    lrange datas 0 -1
    #截取指定区间的元素
    ltrim datas 0 2


应用场景


消息队列、排行榜

4

set(集合)

set集合相当于java中的hashset,它内部是无序的,唯一的,它内部相当于一个特殊的字段,字典中所有的value都是一个NULL,当集合中最后一个元素被移除的时候,内存被回收。set可以存储活动中中奖用户的ID,因为有去重功能,可以保证一个用户不会中奖两次

基本操作指令

  • 添加数据

  • sadd records r1 r2

  • 获取所有数据

  • smembers records

  • 判断元素是否存在

    sismember records r1

  • 获取集合长度

  • scard records


应用场景


好友、随机推荐、黑白名单

5

zset(有序列表)

zset其实就是sortedset和hashmap的结合体,它具备set的唯一性。又具备map的key,value性质,但是这个value存储的是他的分值,用来排序。他的内部采用一个“跳跃列表的数据结构”。
zset可以用来存储粉丝列表,value值是用户ID,score是关注时间,我们可以对粉丝列表按照关注时间进行排序。

基本操作指令

  • 添加数据

  • zadd grades 100 zhangsan 99 lisi

  • 获取指定范围内的元素

  • #默认按照score升序
    zrange grades 0 -1
    降序排序
    zrevrange grades 0 -1

  • 获取指定元素的score

    zscore grades zhangsan

  • 获取元素的排名

  • zrank grades lisi

  • 获取两个分数区间的数据

    zrangebyscore grades -inf(负无穷大) inf(正无穷大) widthscores

  • 删除指定元素

  • zrem grades zhangsan


扩展知识


什么是跳跃列表?

首先跳跃列表是按照分层制的,最后一层会把所有元素按照顺序串起来,然后在这些底层元素中再选部分数值作为代表,抽取到上一层。再从这些抽取中的数据选择部分数据作为代表,抽取到顶层,这样进行数据查找的时候只需要从顶层查到大致所在的范围,逐渐往下渗透,找到具体的位置,添加和删除也是一样步骤。
现在学习Redis还来得及么(1)
图片来自网络

设置了key的过期时间,如何查看?

  
    
    
  
ttl key



现在学习Redis还来得及么(1)
认真读一本书

按照惯例,文末必推一本书,这本书我也买过纸质书,本系列所有内容都是围绕本书结合自身学习进行总结归纳的。

现在学习Redis还来得及么(1)
现在学习Redis还来得及么(1)


如果需要电子版,也可以关注公众号“乐哉开讲“,后台点击“干货领取“。「当然,写书不易,条件允许的话,还请支持正版。」