• redis学习笔记


    redis

    redis是一个高性能的key-value数据库,它是完全开源免费,使用C语言编写的,而且redis是一个NOSQL类型数据库是为了解决高并发、高扩展,大数据存储等一系列的问题而产生的数据库解决方案,是一个非关系型的数据库。但是,它也是不能替代关系型数据库,只能作为特定环境下的扩充。

    redis是一个以key-value存储的数据库结构型服务器,它支持的数据结构类型包括:字符串(String)、链表(lists)、哈希表(hash)、集合(set)、有序集合(Zset)等。为了保证读取的效率,redis把数据对象都存储在内存当中,它可以支持周期性的把更新的数据写入磁盘文件中。而且它还提供了交集和并集,以及一些不同方式排序的操作。

    redis的优势和特点:

    1、redis数据读写速度非常快,因为它把数据都读取到内存当中操作,而且redis是用C语言编写的,是最“接近“”操作系统的语言,所以执行速度相对较快。

    2、redis虽然数据的读取都存在内存当中,但是最终它是支持数据持久化到磁盘当中

    3、redis提供了丰富的数据结构

    4、redis的所有操作都是原子性,支持事务,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行。

    5、redis 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离

    redis的应用场景:

    1、redis由于数据的读取和操作都在内存当中操作,读写的效率较高,所以经常被用来做数据的缓存。把一些需要频繁访问的数据,而且在短时间之内不会发生变化的,放入redis中进行操作。从而提高用户的请求速度和降低网站的负载,降低数据库的读写次数,就把这些数据放到缓存中。

    2、一些常用的实时计算的功能。需要实时变化和展示的功能,就可以把相关数据放在redis中进行操作。大大提高效率。

    3、消息队列,经常用来构建类似实时聊天系统的功能,大大提高应用的可用性。

    程序目录

    从redis.io下载最新版redis-X.Y.Z.tar.gz后解压,然后进入redis-X.Y.Z文件夹后直接make即可,安装非常简单。
    make成功后会在src文件夹下产生一些二进制可执行文件:

    $ find . -type f -executable
    ./redis-benchmark 		//用于进行redis性能测试的工具
    ./redis-check-dump 		//用于修复出问题的dump.rdb文件
    ./redis-cli 			//redis的客户端
    ./redis-server 			//redis的服务端
    ./redis-check-aof 		//用于修复出问题的AOF文件
    ./redis-sentinel 		//用于集群管理
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    启动

    【服务端】
    ./redis-server 就可以启动服务端,默认情况下,redis-server会以非daemon的方式来运行,且默认服务端口为6379。
    【客户端】

    $ ./redis-cli--启动
    127.0.0.1:6379> set name "roc"  --set指令来设置key、value
    OK
    127.0.0.1:6379> get name 		--用get获取值
    "roc"
    127.0.0.1:6379> shutdown 		--/通过客户端来关闭redis服务端
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    redis数据结构

    redis是一种高级的key:value存储系统,其中value支持五种数据类型
    1.字符串(strings
    2.字符串列表(lists
    3.字符串集合(sets
    4.有序字符串集合(sorted sets
    5.哈希(hashes

    而关于key:
    1.key不要太长,尽量不要超过1024字节,这不仅消耗内存,而且会降低查找的效率;
    2.key也不要太短,太短的话,key的可读性会降低;
    3.在一个项目中,key最好使用统一的命名模式,例如user:10000:passwd。

    【redis数据结构 – strings】

    String类型是redis的最基础的数据结构,也是最经常使用到的类型。而且其他的四种类型多多少少都是在字符串类型的基础上构建的,所以String类型是redis的基础。

    string 类型的值最大能存储 512MB,这里的String类型可以是简单字符串、复杂的xml/json的字符串、二进制图像或者音频的字符串、以及可以是数字的字符串。
    常用操作:set 、get 、getset、mget、Setnx、append、incr 、decr…
    例:

    127.0.0.1:6379> set mynum "2"
    OK
    127.0.0.1:6379> get mynum
    "2"
    127.0.0.1:6379> incr mynum
    (integer) 3
    127.0.0.1:6379> get mynum
    "3"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在遇到数值操作时,redis会将字符串类型转换成数值,INCR等指令本身就具有原子操作的特性,我们可以利用redis的INCR、INCRBY、DECR、DECRBY等指令来实现原子计数的效果。

    常用场景

    1、缓存功能:String字符串是最常用的数据类型,不仅仅是redis,各个语言都是最基本类型,因此,利用redis作为缓存,配合其它数据库作为存储层,利用redis支持高并发的特点,可以大大加快系统的读写速度、以及降低后端数据库的压力。

    2、计数器:许多系统都会使用redis作为系统的实时计数器,可以快速实现计数和查询的功能。而且最终的数据结果可以按照特定的时间落地到数据库或者其它存储介质当中进行永久保存。

    3、共享用户session:用户重新刷新一次界面,可能需要访问一下数据进行重新登录,或者访问页面缓存cookie,但是可以利用redis将用户的session集中管理,在这种模式只需要保证redis的高可用,每次用户session的更新和获取都可以快速完成。大大提高效率。

    【redis数据结构 – lists(链表)】

    redis中的lists在底层实现上是链表,可以充当队列或者栈的角色。
    redis列表是链表型的数据结构,所以它的元素是有序的,而且列表内的元素是可以重复的。意味着它可以根据链表的下标获取指定的元素和某个范围内的元素集。

    优点:在头部和尾部插入一个新元素,其时间复杂度是常数级别的。
    缺点:链表型lists的元素定位慢。
    常用操作lpushrpushlrange
    blpop(等待移取出列表的第一个元素) 、brpop (等待移取出list列表的最后一个元素)、Linsert (某一个元素前或者后插入另外一个元素)
    lindex (链表的下标索引获取列表中的元素)、llen (返回list列表的长度)
    -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素

    127.0.0.1:6379> lpush mylist "1"    //新建一个list叫做mylist,并在列表头部插入元素"1"
    (integer) 1    //返回当前mylist中的元素个数
    127.0.0.1:6379> rpush mylist "2"    //在mylist右侧插入元素"2"
    (integer) 2
    127.0.0.1:6379> lpush mylist "0"     //在mylist左侧插入元素"0"
    (integer) 3
    127.0.0.1:6379> lrange mylist 0 1     //列出mylist中从编号0到编号1的元素
    1) "0"
    2) "1"
    127.0.0.1:6379> lrange mylist 0 -1     //列出mylist中从编号0到倒数第一个元素
    1) "0"
    2) "1"
    3) "2"
    127.0.0.1:6379>blpop mylist 10	 //取出列表的第一个元素,没有会一直等待到超时,或发现有数据为止。10秒没有可返回的数据,就返回nil
    1) "mylist"
    2) "0"
    127.0.0.1:6379>brpop mylist 10    //等待取最后一个元素
    1) "mylist"
    2) "2"
    127.0.0.1:6379>linsert mylist before 1 3    //在list列表的某一个元素前或者后插入另外一个元素。当指的的元素不存在时,不执行任何动作。如果列表不存在时,视为空列表,不执行任何动作。
    (integer) 2
    127.0.0.1:6379>lindex mylist 1    			//下标从0开始,-1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素
    "3"
    127.0.0.1:6379>llen mylist 					//回list列表的长度。 假如list不存在,则 list 被解释为一个空列表,返回 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    实际应用:
    1.实现消息队列,可确保先后顺序,不必像MySQL需ORDER BY进行排序。
    2.lrange 可方便实现分页功能。
    3.在博客系统中每片博文的评论可以存入一个单独的list中。

    常用的应用场景:
    1、消息队列:reids的链表结构,可以轻松实现阻塞队列,可以使用左进右出的命令组成来完成队列的设计。比如:数据的生产者可以通过Lpush命令从左边插入数据,多个数据消费者,可以使用BRpop命令阻塞的“抢”列表尾部的数据。
    2、文章列表或者数据分页展示的应用。比如,我们常用的博客网站的文章列表,当用户量越来越多时,而且每一个用户都有自己的文章列表,而且当文章多时,都需要分页展示,这时可以考虑使用redis的列表,列表不但有序同时还支持按照范围内获取元素,可以完美解决分页查询功能。大大提高查询效率。

    【redis数据结构 – 集合(哈希表)】

    redis集合(set)类型和list列表类型类似,都可以用来存储多个字符串元素的集合。但是和list不同的是set集合当中不允许重复的元素。而且set集合当中元素是没有顺序的,不存在元素下标

    redis的set类型是使用哈希表构造的,因此复杂度是O(1),它支持集合内的增删改查,并且支持多个集合间的交集、并集、差集操作。可以利用这些集合操作,解决程序开发过程当中很多数据集合间的问题。

    【无序集合-sets】
    sets无序集合,集合中的元素没有先后顺序。
    常用操作:sadd 、smembers 、sismember 、sunion
    集合相关的操作:添加新元素、删除已有元素、取交集、取并集、取差集等。

    127.0.0.1:6379> sadd myset "one" 		//向集合myset中加入一个新元素"one"
    (integer) 1
    127.0.0.1:6379> sadd myset "two"
    (integer) 1
    127.0.0.1:6379> smembers myset 			//列出集合myset中的所有元素
    1) "one"
    2) "two"
    127.0.0.1:6379> sismember myset "one"  		//判断元素1是否在集合myset中,返回1表示存在
    (integer) 1
    127.0.0.1:6379> sismember myset "three" 	//判断元素3是否在集合myset中,返回0表示不存在
    (integer) 0
    127.0.0.1:6379> sadd yourset "1" 		//新建一个新的集合yourset
    (integer) 1
    127.0.0.1:6379> sadd yourset "2"
    (integer) 1
    127.0.0.1:6379> smembers yourset
    1) "1"
    2) "2"
    127.0.0.1:6379> sunion myset yourset 		//对两个集合求并集
    1) "1"
    2) "one"
    3) "2"
    4) "two"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    实际应用:
    如QQ有一个社交功能叫做“好友标签”,给你的好友贴标签时可以使用redis的集合实现。

    【有序集合-zsets(sorted sets)】
    有序集合给每个元素多设置了一个分数(score),利用该分数作为排序的依据。有序集合可以利用分数进行从小到大的排序。虽然有序集合的成员是唯一的,但是分数(score)却可以重复

    很多时候,我们都将redis中的有序集合叫做zsets,这是因为在redis中,有序集合相关的操作指令都是以z开头的,如zrange、zadd、zrevrange、zrangebyscore等等。

    127.0.0.1:6379> zadd myzset 1 baidu.com 		//新增一个有序集合myzset,并加入一个元素baidu.com,给它赋予的序号是1
    (integer) 1
    127.0.0.1:6379> zadd myzset 3 360.com 			//向myzset中新增一个元素360.com,赋予它的序号是3
    (integer) 1
    127.0.0.1:6379> zadd myzset 2 google.com 		//向myzset中新增一个元素google.com,赋予它的序号是2
    (integer) 1
    127.0.0.1:6379> zrange myzset 0 -1 with scores 	//列出myzset的所有元素,同时列出其序号,可以看出myzset已经是有序的了。
    1) "baidu.com"
    2) "1"
    3) "google.com"
    4) "2"
    5) "360.com"
    6) "3"
    127.0.0.1:6379> zrange myzset 0 -1 				//只列出myzset的元素
    1) "baidu.com"
    2) "google.com"
    3) "360.com"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    【10个OOM异常的场景以及对应的排查经验】
    MySQL5.7之SSL/TLS加密连接配置
    流氓设备检测和预防
    prometheus描点原理
    1、 赛灵思-Zynq UltraScale+ MPSoCs:产品简介
    筒仓料位监测|敢不敢对“精度”下狠手!您家筒仓料位测得准吗?
    安装ora2pg遇到如下问题
    设计一个 SSO 单点登录系统
    DockerCompose - 部署 Nexus 私服
    【C语言】—— 动态内存管理
  • 原文地址:https://blog.csdn.net/qq_43205267/article/details/127731004