Redis 学习笔记总结

Posted IT_Holmes

tags:

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

文章目录

1. 为什么使用NoSQL数据库?

1.1 技术划分


对于我们学习的技术按照解决问题分类可以分为下面几种:

1.2 使用nosql数据库 来解决CPU及内存压力


服务器集群的session问题?

就是我们发起了一个session会话,那么怎么让服务器集群统一识别到呢?也就是session应该存在哪里?

解决办法:

  • 方法一:存在cookies里。缺点:不安全,网络负担效率低。
  • 方法二:session复制,就是将session会话的信息复制到每一个tomcat中。缺点:浪费大量空间,冗余。
  • 方法三(最好的):使用nosql数据库(缓存数据库),完全在内存中,速度快,数据结构简单。

1.3 使用nosql数据库 解决IO压力


这里的IO压力指的是对数据库中进行读操作和写操作的量。

如果大量进行频繁的读写操作,数据库肯定受不了,变慢!

这样我们可以通过加入nosql缓存数据库,来达到一个缓存的效果。从而减少io的读操作。

2. NoSQL 数据库

2.1 什么是NoSQL数据库?


NoSQL全称:not only sql ,不仅仅是SQL , 泛指非关系型数据库。

NoSQL不依赖业务逻辑方式存储,直接以key-value键值对的方式存储。因此大大增加了数据库的扩展能力。

NoSQL数据库的特点:

  • 不遵循SQL标准。
  • 不支持ACID(不支持ACID,不代表不支持事务)。
  • 远超SQL的性能。

2.2 NoSQL的 适用场景和不适用场景


NoSQL的适用场景:

  • 对数据高并发的读写。
  • 海量数据的读写。
  • 对数据高可拓展性的(就是类似数据库中的数据进行延伸出来的,将数据库中的数据存到NoSQL这就是一种拓展效果。)

NoSQL的不适用场景:

  • 需要事务支持。
  • 像基于sql的结构化查询存储,处理复杂的关系,需要即席查询(Ad Hoc,是用户根据自己的需求,灵活的选择查询条件的查询)。
  • 用不着sql的和用来sql也不行的情况下,请考虑用Nosql。

2.3 几种NoSQL数据库的介绍


早期的是Memcache,认识认识就好。

Memcache与redis的区别:

  • memcache支持的数据类型单一,而redis支持多种数据类型。
  • memcache不支持持久化操作,只能在内存中进行存储。redis既能在内存存储,也能持久化存储。
  • memcache使用的是多线程+锁的方式(给每一个线程加上锁)。redis使用的是单线程+多路IO复用。后者虽然单线程,但是能达到多线程的效果,并且效率比前者更加优秀。

Redis数据库(一般作为缓存数据库辅助持久化的数据库):


MongoDB数据库(文档型数据库):

3. 行式或列式存储数据库(大数据时代)


3.1 行式数据库


好处就是我们查询一个人的信息很快,因为一行内容都在么。

坏处就是如果我们所有用户的平均年龄啥的,这样就很慢。

3.2 列式数据库



好处和坏处与上面相反。使用列式就很方便统一所有人的年龄平均数啥的了。

3.3 其他


像什么Hadoop专用的Hbase数据库(也是nosql数据库,基于HDFS),apache的cassandra(开源分布式NoSQL数据库),图关系型数据库等等。

我们可以在https://db-engines.com/en/上面查看到全世界数据库的使用排名。

随手提一句查看全球编程语言的使用排名https://www.tiobe.com/tiobe-index/

4. Redis的介绍 和 应用场景

4.1 介绍


4.2 应用场景


场景一:配合关系型数据库做高速缓存。

场景二:分布式架构上面的session共享。

场景三:

5. Redis 安装


首先,说明一点redis的安装环境必须是linux,因为目前官方给出的也只是支持linux版本的(有支持window版本,我们没必要使用,因为项目肯定都在linux系统上面)。


安装步骤:

第一步:在官方下载redis安装包。https://redis.io/
并且存到我们的linux服务器中。

第二步:安装C语言的编译环境。redis是需要c语言编译环境的。

  • 安装gcc,gcc --version来查看当前是否有gcc。

第三步:解压redis压缩包。

  • 使用tar -zxvf redis-x.x.x.tar.gz命令解压。

第四步:make命令编译和安装。

  • cd /redis-x.x.x 的目录下,执行make命令,将目录下的文件编程为c文件。

    (如果报错什么 -Jemalloc/jemalloc.h:没有那个文件,要么就是没安装gcc环境,要么就是里面已经有编译完成的文件,执行make distclean命令来清除编译文件就可以了。)

  • 跳过make test,直接make install进行编译安装就可以了。

  • 默认是安装到了/usr/local/bin目录下。

第五步:对redis编译安装后,文件的一些解释。

  • 下面这些文件都可以在我们编译安装后的/usr/local/bin目录下看到。
  • 最重要的两个文件redis-server(redis服务器启动命令) , redis-cli(客户端,操作入口)。

到这redis就安装完成了。

6. Redis的 启动

6.1 前台启动redis(不推荐!)


有关redis的启动命令,之前我kill -9 和shutdown都不管用,这里使用可以关闭redis服务。

直接在/user/local/bin下,执行redis-server服务启动命令。

6.2 后台启动(推荐)


首先,进入安装radis的目录文件下,copy一份radis.conf文件,我们使用复制的文件来进行操作。

第一步:输入vi radis.conf命令 编辑radis.conf文件,将daemonize 设置为yes。

daemonize是用来指定redis是否要用守护线程的方式启动。

第二步:执行redis-server /复制的路径/redis.conf 命令后台启动redis服务。

第三步:执行redis-cli 进入redis的客户端,就可以执行redis命令了。

7. Redis 关闭服务


方法一:执行redis-cli命令,在客户端中,直接执行shutdown命令就可以关闭了。

方便点就直接在linux端执行redis-cli shutdown 关闭redis就可以了。


方法二:通过ps -ef | grep redis命令找到它的进程的pid。直接通过kill -9 pid号 杀死进程就可以了。

8. Redis 介绍相关知识


Redis的端口号为6379,这个要牢记。

Redis有16个默认的数据库(0~15号库),类似数组下标从0开始,初始默认使用0号库。

我们可以使用select <dbid>来切换数据库。

此外,这0~15号库使用的同样的密码,统一密码管理。

redis使用的是单线程+多路IO复用的技术。

为了好理解多路IO复用,看下图:


Memcache与redis的区别:

  • memcache支持的数据类型单一,而redis支持多种数据类型。
  • memcache不支持持久化操作,只能在内存中进行存储。redis既能在内存存储,也能持久化存储。
  • memcache使用的是多线程+锁的方式(给每一个线程加上锁)。redis使用的是单线程+多路IO复用。后者虽然单线程,但是能达到多线程的效果,并且效率比前者更加优秀。

9. Redis 常用五大数据类型

9.1 Redis五个数据类型


9.2 Redis的 键(key) 的操作


key * 命令:查看当前数据库所有key值的命令。


exists key_name :判断这个key_name是否存在。


type key_name命令:查看这个key_name是什么类型。


del key_name命令:删除指定的key数据。

unlink key_name命令:根据value选择非阻塞删除。

  • del和unlink都能达到删除的效果。但是两者还有些不同,del就是直接删除。而unlink是非阻塞删除。
  • 非阻塞删除就是仅将key_name从keyspace元数据中删除,真正的删除会在后续异步操作内删除,就是表面上删除了,其实还没有,会在后续不阻塞的情况下删除。

expire key [过期时间] 命令:为给定的key设置过期时间。

ttl key_name命令:查看还有多少秒过期,-1表示永不过期,-2表示已经过期。


select [几号库]命令:切换数据库。

dbsize 命令查看当前数据库的key的数量。

flushdb 命令清空当前库。

flushall 命令将全部库都清空。

10. Redis 字符串(String)


String是Redis最基本的类,你可以理解成与Memcached一模一样的类型,一个key对应一个value。

String类型是二进制安全的。意味着Redis的string可以包含任何数据。例如:jpg图片,序列化对象等。

String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M


set key value 命令:添加键值对。

get key命令:查询对应键值。


append key value 命令:将给定的value追加到原值的末尾。


strlen key 命令:获取值的长度。


setnx key value 命令:只有key不存在时,设置key的值。


incr key 命令:将key中存储的数字值增1(只能对数字值操作,如果为空,新增值为1)。

decr key 命令:将key中存储的数字值减1(只能对数字值操作,如果为空,新增至为-1)


如果想要设置步长的话,就是用incrby 和decrby命令。

incrby / decrby key 步长 命令:将key中存储的数字值增减,自定义步长。

了解一下incr 和 decr 的原子性(也就是redis的原子性):


原子性,原子性操作都要理解掌握!例如:java中的i++属于是不属于原子操作,一旦运行相互之间就影响了。

原子性特性:一个失败,全都失败。


与上面对应的mset , mget , msetnx 同时设置获取多个键值对的效果。


getrange key 起始位置 结束为止 命令:获得值的范围(类似java中的substring),要注意的是java中是左闭右开的效果,而这里是左右闭的效果。


setrange key 起始位置 value 命令:用value覆盖掉,起始位置往后的元素。


setex key 过期时间 value 命令:设置键值的同时,设置过期时间,单位秒。


getset key value 命令:以新值换旧值,设置了新值同时显示旧值。


redis的String底层数据结构:简单动态字符串。

11. Redis 列表(list)

11.1 redis的list 介绍


list列表类型,在redis中叫做单键多值

要记住的是,底层是双向链表,然而就是因为双向链表所以对两端的操作性能很高,对中间的索引下标操作性能差点。

11.2 list列表对应的 redis命令


lpush / rpush key_name value […] 命令:从左边或右边插入一个或多个值。


lpop / rpop key_name 命令:从左边或右边吐出一个值。值在键在,值光键亡。


lrange key_name 开始索引 结束索引 命令:按照索引下标获得元素(从左到右)。 此外,lrange key_name 0 -1这个命令表示取key_name的所有值。


rpoplpush key1 key2 命令:从key1列表右边吐出一个值,查到key2列表的左边。


lindex key_name 索引下标 命令:按照索引下标获得元素(从左到右)。

llen key_name 命令:获取key_name的长度。


linsert key_name before/after value insert_value 命令:在value的前面或后面插入insert_value要插入的值。


lrem key_name n value 命令:从左边删除n个value(从左到右)。


lset key_name index value 命令:将列表key_name下标为index的值替换成value。

11.2 redis中 list列表的底层结构


12. Redis 集合(Set)

12.1 set集合的 介绍


set集合,它与list类似是一个列表的功能,特殊之处在于set可以自动排重

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

12.2 set集合常用的命令


sadd key_name value1 value2 […] 命令:将一个或多个member元素加入到集合key中,已经存在的member元素将被忽略。

smembers key_name 命令:取出该集合的所有值。


sismember key_name value 命令:判断集合key_name是否包含value,包含返回1,没有返回0。


scard key_name 命令:返回该集合的元素个数。


srem key_name value1 value2 […] 命令:删除集合中的某个元素。


spop key_name 命令:随机从该集合中吐出一个值(吐出来的值相当于被删除了)。


srandmember key_name n 命令:随机从该集合中去除n个值。不会从集合中删除。


smove [source] [destination] value 命令:把集合中一个值从一个集合移动到另一个集合。


sinter key1 key2 命令:返回两个集合交集元素。


sunion key1 key2 […]命令:返回两个集合或多个集合的并集元素。


sdiff key1 key2 命令:返回两个集合的差集元素(key1中的,不包含key2中的)。

12.3 redis中set集合的数据结构


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

13. Redis 哈希(Hash)

13.1 Redis的哈希(Hash) 介绍


Redis hash 是一个键值对集合。

Redis hash 是一个String类型的field 和 value 的映射表hash特别适合用于存储对象

类似Java里面的Map<String , Object>。

hash在redis存储的结构如下:

还有多个方法能够达到存储对象的目的,但是就hash这种结构已经是最好的。

13.2 redis中hash常用的命令


hset key_name field value 命令:给key_name集合中的field键赋值value。


hget key1 field 命令:从key1集合field取出vlaue。


hmset key 1 field1 value1 field2 value2 […] 命令:批量设置hash的值。


hexists key1 field 查看哈希表key中,给定域field是否存在。(存在返回1,不存在返回0)


hkeys key_name 命令:列出该hash集合的所有field。

hvals key_name 命令:列出该hash集合的所有value。


hincrby key_name field increment 命令:为哈希表key中的域 field的值加上增量increment(增加多少。)。


hsetnx key_name field value 命令:将哈希表key中的域field的值设置为value,当且仅当域field不存在。

13.3 redis中hash的数据结构


14. Redis 有序集合(Zset , sorted set)

14.1 Redis的有序集合(Zset) 介绍


Redis有序集合zset与普通集合set非常相似,也是一个没有重复元素的字符串集合,但是它是有序的!!

14.2 Redis的有序集合(Zset) 命令


zadd key_name score1 value1 score2 value2 […] 命令:将一个或多个member元素及其score值加入到有序集key当中。(注意:score是可以重复的)


zrange key_name start_index end_index [withscores]命令:返回有序集key_name中,下标start 和 下标end之间的元素。(注意:这里start为0,end下标为-1,显示全部内容)

带上withscores命令,可以让分数一起和值返回到结果集。


zrangebyscore key_name min max [withscores] [limit offset count] 命令:返回有序集key中,所有score值介于min和max之间(包括等于min或max)的成员。

有序集成员按score值递增(从小到大)次序排列。

zrevrangebyscore key_name max min [withscores] [limit offset count] 命令:和上面一样,只不过score的值从大到小排列。

这里的limit setoff count 就是和mysql的limit分页一样!setoff记住在命令中就是偏移量的意思,count就是显示几条数据。


zincrby key_name increment value 命令:为元素的score加上增量。返回结果为score的值。


zrem key_name value 命令:删除该集合下,指定值的元素。成功返回1,失败返回0


zcount key_name min max 命令:统计该集合,score分数区间内的元素个数。


zrank key_name value 命令:返回该值在集合中的排名,从0开始。


一般开发中像什么文章访问量的排行榜什么的。我们都是通过有序集合方式实现。

14.3 Redis的有序集合(Zset)的数据结构


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

  • 一个是hash的数据结构,hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。
  • 一个就是跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。

14.4 跳跃表(跳表)


有序集合在生活中比较常见,例如:学生成绩排名,游戏里面的得分玩家排名等等。

对于有序结合的底层实现,我们可以使用数组,平衡树,链表等。数组不便元素的插入,删除;平衡树或红黑树虽然效率高但是结构复杂;链表查询需要遍历所有效率很低。

redis的有序集合实现就是采用的跳跃表方式实现。


对比有序链表 和 跳跃表的效果。

有序链表的效果,查询是从头到尾的查询。

跳跃表的效果:


因此,整体上而言,跳跃表的效率要比有序链表要高很多。

以上是关于Redis 学习笔记总结的主要内容,如果未能解决你的问题,请参考以下文章

Redis 学习笔记总结

Redis 学习笔记总结

Docker 学习笔记总结

Docker 学习笔记总结

redis学习笔记(14)---redis基本命令总结

Redis 学习笔记总结