Redis入门(一)

目录

 第一章 NoSQL数据库

1.1 技术的分类

1.2 NoSQL数据库

1.2.1 概述

1.2.2 适用场景

1.2.3 不适用场景

1.2.4 常见的NoSQL数据库

1.3 行式存储数据库(大数据时代)

1.3.1 行式数据库

1.3.2 列示数据库

1.4 图关系型数据库

第二章 Redis概述及安装

2.1 概述

2.1.1 应用场景

2.2 安装Redis

2.3 前台启动(不推荐)

2.4 后台启动

2.5 Redis相关知识

2.5.1 基础知识

2.5.2 技术基础

第三章 常用五大数据类型

3.1 Redis键key

3.1.1 key相关常用命令

3.1.2 库相关常用命令

3.2 Redis字符串String

3.2.1 简介

3.2.2 String相关的常用命令

3.2.3 String数据结构

3.3 Redis列表List

3.3.1 简介

3.3.2 List相关的常用命令

3.3.3 List数据结构

3.4 Redis集合Set

3.4.1 简介

3.4.2 Set相关的常用命令

3.4.3 Set数据结构

3.5 Redis哈希Hash

3.5.1 简介

3.5.2 Hash相关的常用命令

3.5.3 Hash数据结构

3.6 Redis有序集合ZSet(Sorted Set)

3.6.1 简介

3.6.2 ZSet相关的常用命令

3.6.3 ZSet数据结构

3.6.4 跳跃表(跳表)


第一章 NoSQL数据库

1.1 技术的分类

   ①解决功能性的问题:Java、Jsp、RDBMS、Tomcat、HTML、Linux、JDBC、SVN

   ②解决扩展性的问题:Struts、Spring、SpringMVC、Hibernate、Mybatis

   ③解决性能的问题:NoSQL、Java线程、Hadoop、Nginx、MQ、ElasticSearch

   随着网络的发展,NoSQL的产生是为了解决CPU及内存压力,解决IO压力。

        解决CPU及内存压力:比如以用户登录的session为例,在现代的多台服务器架构中,在一台

      服务器登陆后产生了session对象,但是其他服务器不存在这个session对象,会产生问题,有

      几种解决方法。NoSQL直接通过内存进行读取,可以减少CPU和IO的压力。

        解决IO压力:随着项目的使用积累,数据库内的数据量会急剧增加,会导致操作效率降低。

      NoSQL可以作为缓存来使用,减少IO访问的压力

1.2 NoSQL数据库

1.2.1 概述

   NoSQL:Not Only SQL。不仅仅是SQL,泛指非关系型数据库。

   NoSQL不依赖业务逻辑方式存储(和MySQL不一样),而以简单的key-value模式存储,大大地增加了数据库的扩展能力。

        ①不遵循SQL标准

        ②不支持ACID(原子性、一致性、隔离性、持久性)

        ③远超于SQL的性能

1.2.2 适用场景

   ①对数据高并发的读写

   ②海量数据的读写

   ③对数据高可扩展性的

   ④用不着sql的和用了sql也不行的情况,请考虑用NoSQL

1.2.3 不适用场景

   ①需要事务支持

   ②基于sql的结构化查询存储,处理复杂的关系,需要即席查询

1.2.4 常见的NoSQL数据库

   Memcache:

        ①很早出现的NoSQL数据库

        ②数据都在内存中,一般不持久化

        ③支持简单的key-value模式,支持类型单一

        ④一般是作为缓存数据库辅助持久化的数据库

   Redis

        ①几乎覆盖了Memcached的绝大部分功能

        ②数据都在内存中,支持持久化,主要用作备份恢复

        ③除了支持key-value模式,还支持多种数据结构的存储,比如 list、set、hash、zset

        一般是作为缓存数据库辅助持久化的数据库

   MongoDB:

        ①高性能、开源、模式自由(schema  free)的文档型数据库

        数据都在内存中, 如果内存不足,把不常用的数据保存到硬盘

        ③虽然是key-value模式,但是对value(尤其是json)提供了丰富的查询功能

        ④可以根据数据的特点替代RDBMS ,成为独立的数据库。或者配合RDBMS,存储特定的数据。

1.3 行式存储数据库(大数据时代)

1.3.1 行式数据库

1.3.2 列示数据库

   ①Hbase:是Hadoop项目中的数据库。它用于需要对大量的数据进行随机、实时地读写操作的场景中。HBase的目标就是处理数据量非常庞大的表,可以用普通的计算机处理超过10亿行数据,还可处理有数百万列元素的数据表。

   ②Cassandra:一个免费的开源NoSQL数据库,其设计目的在于管理由大量商用服务器构建起来的庞大集群上的海量数据集(数据量通常达到PB级别)。

1.4 图关系型数据库

   Neo4j

   主要应用:社会关系(好友推荐)、公共交通网络、地图、网络拓扑

第二章 Redis概述及安装

2.1 概述

  • Redis是一个开源的key-value存储系统。
  • 和Memcached类似,但是它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set---有序集合)和hash(哈希类型)。
  • 这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
  • 在此基础上,Redis支持各种不同方式的排序。
  • 与Memcached一样,为了保证效率,数据都是缓存在内存中
  • 区别是Redis会周期性地把更新的数据写入磁盘或者把修改操作写入追加的记录文件(持久化数据)。
  • 并且在此基础上实现了master-slave(主从)同步

2.1.1 应用场景

  • 配合关系型数据库做高速缓存
    • 高频次、热门访问的数据放在内存中,降低数据库IO操作
    • 分布式架构,做session共享

  • 多样的数据结构存储持久化数据

2.2 安装Redis

   redis官网:Redis

   需要安装在Linux环境中。

        ①首先利用Xftp软件把redis下载下的压缩包传入linux系统的opt文件夹下:

        ②使用命令gcc --version是否安装了gcc,如果没有安装的话,使用命令yum install gcc进行安

          装:

        ③进入opt目录,解压redis的压缩包:

        ④解压完成后,进入解压后的包,输入make命令:

        ⑤在输入make install命令即可:

        ⑥默认安装在/usr/local/bin中:

                redis-benchmark:性能测试工具。

                redis-check-aof:修复有问题的AOF文件。

                redis-check-dump:修复有问题的dump.rdb文件。

                redis-sentinel:Redis集群使用。

                redis-server:Redis服务器启动命令。

                redis-cli:客户端,操作入口。

2.3 前台启动(不推荐)

   输入命令redis-server:

2.4 后台启动

   ①备份redis.conf到/etc目标下:

   ②后台启动设置danmonize,将no改为yes(改的etc下的redis.conf):

 

   ③启动Redis:

   ④用客户端redis-cli访问(退出客户端输入exit),然后测试验证:

   ⑤关闭redis:进入终端后输入shutdown进行关闭;或者找到进程号kill进行关闭

2.5 Redis相关知识

2.5.1 基础知识

  • 端口号为6379
  • 默认16个数据库,类似数组下标从0开始初始默认使用0号库,使用命令select <dbid>来切换数据库。

  • 统一使用密码管理,所有库同样密码
  • dbsize查看当前数据库的key的数量
  • flushdb情况当前库
  • flushall通杀全部库

2.5.2 技术基础

   Redis是单线程+多路IO复用技术。

   多路复用是指使用一个线程来检查多个文件描述符(Socket)状态,比如调用select和poll函数,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞到超时。得到就绪状态后进行真正的操作可以在同一个线程里执行,也可以启动线程执行(比如线程池)。

   与memcached对比:

        ①memcached是多线程+锁;redis是单线程+多路IO复用

        ②redis支持更多的数据类型

        ③redis支持持久化

第三章 常用五大数据类型

3.1 Redis键key

3.1.1 key相关常用命令

   关于key的常用命令:

        ①keys *:查看当前库所有key。

        ②exists key:判断某个key是否存在。返回1表示存在,返回-1表示不存在。

        ③type key:查看你的key是什么类型

        ④del key:删除指定的key数据。直接删除

        ⑤unlink key:根据value选择非阻塞删除。仅将keys从keyspace元数据中删除,真正的删除

                               会在后续异步操作

        ⑥expire key 10:为给定的key设置过期时间,10表示10秒。

        ⑦ttl key:查看还有多少秒过期,-1表示永不过期,-2表示已过期。

3.1.2 库相关常用命令

   关于库的常用命令:

        ①select:切换数据库。

        ②dbsize:查看当前数据库的key的数量。

        ③flushdb:清空当前库。

        ④flushall:通杀全部库。

3.2 Redis字符串String

3.2.1 简介

  • String是Redis最基本的类型,一个key对应一个value。
  • String类型是二进制安全的,意味着Redis的string可以包含任何数据,比如jpg图片或者序列化的对象。
  • String类型是Redis最基本的数据类型,Redis中一个字符串value最多可以是512M

3.2.2 String相关的常用命令

   关于String的常用命令:

        1.set <key> <value>:添加键值对。

        2.get <key>:查询对应的键值。

        3.append <key> <value>:将给定的value追加到原值的末尾。

        4.strlen <key>:获得对应的值的长度。

        5.setnx <key> <value>:只有在key不存在时,设置key的value值。key存在不会覆盖原值。

        6.incr <key>:将key中存储的数字值增1,只能对数字值操作,如果为空,新增值为1。

        7.decr <key>:将key中存储的数字值减1,只能对数字值操作,如果为空,新增值为-1。

        8.incrby/decrby <key> <步长>:将key中存储的数字值增减,自定义步长。

           Redis中incr、incrby、decr、decrby属于string数据结构,它们是原子性递增或递减操作。

           原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中

         间不会有任何context switch(切换到另一个线程)。

                ①在单线程中,能够在单挑指令中完成的操作都可以认为是原子操作,因为中断只能发

                  生于指令之间。

                ②在多线程中,不能被其他进程(线程)打断的操作就叫原子操作。

                ③Redis单命令的原子性主要得益于Redis的单线程。

        9.mset <key1> <value1> <key2> <value2>:同时设置一个或多个key-value对。

        10.mget <key1> <key2> <key3>:同时获取一个或多个value。

        11.msetnx <key1> <value1> <key2> <value2>:同时设置一个或多个key-value对,当前仅

             当所有给定key都不存在。原子性,有一个失败就都失败。

        12.getrange <key> <起始位置> <结束位置>:获得值的范围,类似java中的substring,但是

             前后都是闭区间,都包括

        13.setrange <key> <起始位置> <value>:用<value>覆盖<key>所存储的字符串值,从<起始

             位置>开始,索引从0开始

        14.setex <key> <过期时间> <value>:设置键值的同时,设置过期时间,单位秒。

        15.getset <key> <value>:以旧换新,设置了新值同时获得旧值。

3.2.3 String数据结构

   String的数据结构为简单动态字符串(SDS,Simple Dynamic String),是可以修改的字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。

   如图中所示,内部当前字符串实际分配的空间capacity一般要高于实际字符串长度len。当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容时一次只会多扩1M的空间。需要注意的是字符串最大长度为512M

3.3 Redis列表List

3.3.1 简介

  • 单键多值
  • Redis列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边)。
  • 底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会比较差。

3.3.2 List相关的常用命令

   关于List的常用命令:

        1.lpush/rpush <key> <value1> <value2>:从左边/右边插入一个或多个值。

        2.lpop/rpop <key>:从左边/右边吐出一个值。值在键在,值光键亡。

        3.rpoplpush <key1> <key2>:从<key1>列表右边吐出一个值,插到<key2>列表的左边。

        4.lrange <key> <start> <stop>:按照索引下标获得元素(从左到右)。

           lrange mylist 0 -1:0左边第一个,-1右边第一个(0 -1表示获取所有)

        5.lindex <key> <index>:按照索引下标获得元素(从左到右),下标从1开始。

        6.llen <key>:获得列表长度。

        7.linsert <key>  before/after <value> <newvalue>:在<value>的前面/后面插入<newvalue>

           插入值。

        7.lrem <key> <n> <value>:从左边删除n个value(从左到右)。

        8.lset <key> <index> <value>:将列表key下标为index的值替换成value。

3.3.3 List数据结构

   List的数据结构为快速链表quickList

  • 首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构式zipList,即压缩列表。它将所有的元素紧挨在一起存储,分配的是一块连续的内存。
  • 当数据量比较多时会改成quickList。
  • 因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里村的只是int类型的数据,结构上还需要两个额外的指针prev和next。
  • Redis将链表和zipList结合起来组成了quickList,也就是将多个zipList使用双向指针串起来使用,这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。

3.4 Redis集合Set

3.4.1 简介

   Redis中set对外提供的功能与list类似,是一个列表的功能,特殊之处在于set是可以自动排重的,当需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

   Redis的Set是string类型的无序集合。底层其实是一个value为null的hash表,所以添加、删除、查找的复杂度都是O(1)

3.4.2 Set相关的常用命令

   关于Set的常用命令:

        1.sadd <key> <value1> <value2>:将一个或多个member元素加入到集合key中,已经存在

           的member元素将被忽略。

        2.smembers <key>:取出该集合的所有值。

        3.sismember <key> <value>:判断集合<key>是否为含有该<value>值,有1,没有0。

        4.scard <key>:返回该集合的元素个数。

        3.srem <key> <value1> <value2>:删除集合中的某个元素。

        4.spop <key>:随机从该集合中吐出一个值。

        5.srandmember <key> <n>:随机从该集合中取出n个值。不会从集合中删除

        6.smove <source> <destination> <value>:把集合中一个值从一个集合移动到另一个集合。

        7.sinter <key1> <key2>:返回两个集合的交集元素。

        8.sunion <key1> <key2>:返回两个集合的并集元素。

        9.sdiff <key1> <key2>:返回两个集合的差集元素(包含key1中的,不包含key2中的)。

3.4.3 Set数据结构

   Set的数据结构是dict字典,字典使用哈希表实现的。

   Java中HashSet的内部实现使用的是HashMap,只不过所有的value都指向同一个对象。Redis的Set结构也是一样,它的内部也使用hash结构,所有的value都指向同一个内部值。

3.5 Redis哈希Hash

3.5.1 简介

  • Hash是一个值对键集合
  • Hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
  • 类似Java中的Map<String,Object>。

   假设用户ID为查找的key,存储的value是用户对象包括姓名、年龄、生日等信息。

        如果用普通的key-value来存储,主要有以下2种存储方式:

        如果使用Hash表来存储:

3.5.2 Hash相关的常用命令

   关于Hash的常用命令:

        1.hset <key> <field> <value>:给<key>集合中的<field>键赋值<value>。

        2.hget <key> <field>:从<key>集合中的<field>取出对应的value。

        3.hmset <key> <field1> <value1> <field2> <value2>:批量设置hash的值。

        4.hexists <key> <field>:查看哈希表key中,给定域field是否存在。存在1,不存在0。

        5.hkeys <key>:列出该hash集合的所有field。

        6.hvals <key>:列出该hash集合的所有value。

        7.hincrby <key> <field> <increment>:为哈希表key中的域field的值加上增量。

        8.hsetnx <key> <field> <value>:将哈希表key中的域field的值设置为value,当且仅当

           field不存在

3.5.3 Hash数据结构

   Hash类型对应的数据结构是两种:zipList(压缩列表)和hashtable(哈希表)。当field-value长度较短且个数较少时,使用zipList,否则使用hashtable。

3.6 Redis有序集合ZSet(Sorted Set)

3.6.1 简介

  • Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。
  • 不同之处是有序集合zset的每个成员都关联了一个评分score,这个评分被用来按照从最低到最高分的方式排序集合中的成员。集合中的成员是唯一的,但是评分是可以重复的
  • 因为元素是有序的,因此可以很快地根据评分或者次序来获取一个范围的元素。
  • 访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。

3.6.2 ZSet相关的常用命令

   关于ZSet的常用命令:

        1.zadd  <key> <score1> <value1> <score2> <value2>:将一个或多个member元素及其

           score值加入到有序集key当中。

        2.zrange <key> <start> <stop> [WITHSCORES]:返回有序集key中,下标在<start><stop>

           之间的元素。带WITHSCORES,可以让分数一起和值返回到结果集。

        3.zrangebyscore <key> <min> <max> [withscores] [limit offset count]:返回有序集key中,

           所有score 值介于min和max之间(包括等于min或max)的成员。有序集成员按score值递增

           (从小到大)次序排列。

        4.zrevrangebyscore <key> <max> <min> [withscores] [limit offset count]:同上,改为从大

           到小排列

        5.zincrby <key> <increment> <value>:为元素的score加上增量。

        6.zrem  <key> <value>:删除该集合下,指定值的元素。

        7.zcount <key> <min> <max>:统计该集合,分数区间内的元素个数.

        8.zrank <key> <value>:返回该值在集合中的排名,从0开始。

3.6.3 ZSet数据结构

   SortedSet(zset)是Redis提供的一个非常特别的数据结构,一方面它等价于Java中的Map<String,Double>,可以给每一个元素value赋予一个权重score,另一方面它又类似于TreeSet,内部的元素会按照score进行排序,可以得到每个元素的名词,还可以通过score的范围来获取元素的列表。

   zset底层使用了两个数据结构:

        ①hash:hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元

           素value找到相应的score值。

        ②跳跃表:跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。

3.6.4 跳跃表(跳表)

   参考:跳跃表的原理及实现_qpzkobe的博客-CSDN博客_跳表实现原理

   简介:对于有序集合的底层实现,可以用数组、平衡树、链表等。数组不便元素的插入、删除;平衡树或红黑树虽然效率高但结构复杂;链表查询需要遍历所有元素效率低。Redis采用的是跳跃表,跳跃表的效率堪比红黑树,实现远比红黑树简单。

   实例:对比有序列表和跳跃表,查找出51。

        ①有序链表:需要从第一个元素开始依次查找、比较才能找到。需要6次比较。

        ②跳跃表:从第2层开始,1节点比51节点小,向后比较。21节点比51节点小,继续向后比

          较,后面就是NULL了,所以从21节点向下到第1层在第1层,41节点比51节点小,继续向

          后,61节点比51节点大,所以从41向下在第0层,51节点为要查找的节点,节点被找到,共

          查找4次。

PS:根据尚硅谷课程整理,如有侵权,联系删除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值