Redis 学习笔记总结
Posted IT_Holmes
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis 学习笔记总结相关的知识,希望对你有一定的参考价值。
文章目录
- 1. 为什么使用NoSQL数据库?
- 2. NoSQL 数据库
- 3. 行式或列式存储数据库(大数据时代)
- 4. Redis的介绍 和 应用场景
- 5. Redis 安装
- 6. Redis的 启动
- 7. Redis 关闭服务
- 8. Redis 介绍相关知识
- 9. Redis 常用五大数据类型
- 10. Redis 字符串(String)
- 11. Redis 列表(list)
- 12. Redis 集合(Set)
- 13. Redis 哈希(Hash)
- 14. Redis 有序集合(Zset , sorted set)
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 学习笔记总结的主要内容,如果未能解决你的问题,请参考以下文章