深入理解Redis

时间:2022-11-07 11:00:33

文章目录

深入理解Redis

一、什么是NoSQL

★NoSQL(NoSQL = Not Only SQL ),意思是“不仅仅是 SQL”,是非关系型数据库的总称,键值对存储、列存储、文档存储、图形数据库(社交关系)。

★关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。

★NoSQL特点
1:方便扩展(数据之间没有关系,很好扩展)
2:大数据量高性能(Redis一秒写8万,读取11万,NoSQL的缓存记录级,是一种细粒度的缓存,性能会比较高)
3:数据类型是多样型的(不需要事先设计数据库,随取随用)

★大数据的3V(主要是描述问题的)
海量(Volume)
多样(Variety)
实时(Velocity)

★大数据的3高(主要是对程序的要求)
高并发
高可扩
高性能

二、NoSQL的四大分类

★KV键值对:
新浪:Redis
美图:Redis+Tair
阿里、百度:Redis+Memecache

★文档型数据库(使用Bson格式,与Json格式一样)
MongoDB(一般必须要掌握),是一个基于分布式文件存储的数据库,C++编写,主要用来处理大量的文档。MongoDB是一个介于关系型数据库和非关系型数据库中中间的产品!MongoDB是非关系型数据库中功能最丰富,最像关系型数据库的。另一个文档型数据库为ConthDB。

★列存储数据库
HBase
分布式文件系统

★图关系数据库
深入理解Redis
它不是存储图形,放的是关系,比如:朋友圈社交网络,广告推荐!(Neo4j,InfoGrid)
深入理解Redis

三、Redis是什么?

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。免费和开源!是当下最热门上午NoSQL技术之一!也被人们称之为结构化数据库!
深入理解Redis
官网:

https://redis.io/

中文网:

http://www.redis.cn/

Redis推荐都是在Linux服务器上搭建的,我们是基于Linux学习的!

四、Redis的基础知识

★Redis默认有16个数据库(配置文件redis.conf中有,默认使用第0个数据库;端口号6379)
深入理解Redis
深入理解Redis

①“select index”命令进行切换数据库

深入理解Redis

②“dbsize”命令查看数据库的大小

深入理解Redis

③“keys *”命令查看当前数据库中所有的键

深入理解Redis

④“flushdb”命令清除当前数据库,“flushall”命令清除所有数据库

深入理解Redis

⑤“exists key”命令判断某个键是否存在,不存在为0,存在为1

深入理解Redis

⑥“move key 1”命令移除当前数据库某个键,1代表当前库

深入理解Redis

⑦“expire key 10”命令设置某个键的过期时间,单位是秒,10秒;“ttl key”命令查看某个键剩余时间,-2代表已过期,自动过期,不存在了

深入理解Redis

⑧“type key”命令查看某个键是什么类型

深入理解Redis

★Redis是单线程的,是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了!Redis是所有的数据全部放到内存中的,所以说使用单线程操作效率就是最高的,多线程(CPU上下文会切换,耗时的操作),对于内存系统来说,如果没有上下文切换效率就是最高的,多次读写都是在一个CPU上的,在内存情况下,这个就是最佳方案。可以用作数据库、缓存、消息中间件MQ。
官方命令大全:

https://redis.io/commands/

五、Redis五大基础数据类型

字符串(String)

String类似的使用场景,value除了是字符串,还可以是数字。计数器、统计多单位的数量,关注数,粉丝数,对象缓存存储。

1:(set key value)命令设置值,(get key)命令获取值

深入理解Redis

2:(append key “str”)命令在某个键后追加字符串,如果当前key不存在就相当于set key了

深入理解Redis

3:(strlen key)命令获取某个键,字符串的长度

深入理解Redis

4:关于加1(incr key)命令和减1(decr key)命令的操作(常用于点赞量,例 如,set count 0,加 incr count/减 decr count),实现步长,加10(incrby count 10),减10(decrby count 10)

深入理解Redis
深入理解Redis

5:(getrange key startIndex endIndex)命令获取范围内的字符串,左右都是闭区间,getrange key 0 -1 查看全部字符串

深入理解Redis

6:(setrange key index value)命令替换指定位置开始的字符串

深入理解Redis

7:(setex key 秒 value)命令设置过期时间,set with expire

无Key时,新增操作,附加过期时间
深入理解Redis
有Key时,修改操作,附加过期时间
深入理解Redis

8:(setnx key value),不存在key在设置,表示当前key如果是存在的,就不会设置成功,set if not exist,在分布式锁中会常常使用

深入理解Redis
深入理解Redis

9:(mset key1 value1 key2 value2 key3 value3)命令批量设置值,(mget key1 key2 key3)命令批量获取值

深入理解Redis

10:(msetnx key1 value1 key4 value4)命令不会设置成功,返回值0,因为key1是存在的,即使key4是不存在的,也不会设置成功,原子性的操作,要么一起成功,要么一起失败

深入理解Redis

11:(set user:1 {name:zzy,age:18}),设置user:1对象,json字符串来保存对象,不推荐;(mset user:1:name zzy user:1:age 18)批量设置,推荐;这里的key是一个巧妙的设计,user:{id}:{属性名};(mget user:1:name user:1:age)批量获取

深入理解Redis

12:(getset key value)命令先get,然后在set

深入理解Redis

散列(Hash)

使用场景:hash存一些变更数据,用户信息的保存,经常变动的信息,hash更适合对象的存储,这时候value是map集合(hash),所有的hash命令都是英文“h”开头的,本质和string类型没有太大的区别,还是一个简单的key-value。

1:(hset key mapkey mapvalue)命令设置值,(hget key mapkey)命令获取值

深入理解Redis

2:(hmset key mapkey1 mapvalue1 mapkey2 mapvalue2)命令批量设置值,(hmget key mapkey1 mapkey2)命令批量获取值

深入理解Redis

3:(hgetall key)命令获取key中全部hash值

深入理解Redis

4:(hdel key mapkey)命令删除值

深入理解Redis

5:(hlen key)命令获取hash键值对的长度

深入理解Redis

6:(hexists key mapkey)命令判断hash中指定的字段是否存在

深入理解Redis

7:(hkeys key)命令获取hash中所有的key

深入理解Redis

8:(hvals key)命令获取hash中所有的value

深入理解Redis

9:(hincrby key mapkey 1)命令hash值增量

深入理解Redis

10:(hsetnx key mapkey mapvalue)命令如果hash不存在则可以设置,存在的话不能设置,常用于分布式锁

深入理解Redis

列表(List)

使用场景:消息排队、消息队列、栈;
实际是一个链表,before/after/left/right都可以插入值;
如果key不存在,创建新的链表,如果key存在,新增内容;
如果移除了所有值,空链表,也代表不存在;
在两边插入值或者改动值,效率高,中间元素,相对来说效率会低一点;
基本的数据类型,列表,可以模拟队列(先进先出)、栈(后进先出)、阻塞队列,所有的list命令都是英文“l”开头的,可以存在重复值

1:(lpush key value)命令模拟栈,后进先出,插入到列表头部

深入理解Redis

2:(rpush key value)命令模拟队列,先进先出,插入到列表尾部,(lrange key 0 -1)命令获取全部列表

深入理解Redis

3:(lpop key)命令左侧移除元素,移除列表第一个元素,(rpop key)命令右侧移除元素,移除列表最后一个元素

深入理解Redis

4:(lindex key index)命令获取列表某一个索引的值

深入理解Redis

5:(llen key)命令获取列表的长度

深入理解Redis

6:(lrem key 个数 value)命令移除多个value,从头到尾,精确匹配

深入理解Redis

7:(ltrim key start stop)命令通过下标截取指定的长度,start=1,stop=2,数字为索引,左右闭区间

深入理解Redis

8:(rpoplpush key 其它list的key)命令移除列表最后一个元素,插入到列表头部

深入理解Redis

9:(lset key index item)命令列表根据索引进行更新操作

深入理解Redis

10:(linsert key before/after “word” “other”)命令在指定元素前面/后面插入新元素

深入理解Redis

集合(Set)

使用场景:共同爱好,二度好友,推荐好友(六度分割理论)
set中的值是不能重复的,所有的set命令都是英文“s”开头的,无序不重复集合,抽随机

1:(sadd key value)命令集合中新增元素,(smembers key)命令查看集合所有元素

深入理解Redis

2:(sismember key value)命令查看某个值是否存在于集合中,1存在,0不存在

深入理解Redis

3:(scard key)命令获取集合元素的个数值

深入理解Redis

4:(srem key value)命令移除集合中的某一个元素

深入理解Redis

5:(srandmember key count)命令随机抽取几个元素,类似抽奖,count不写为抽取一个元素

深入理解Redis

6:(spop key)命令随机移除集合中的一个元素

深入理解Redis

7:(smove key otherkey value)命令将一个指定的值,移动到另外一个set集合

深入理解Redis

8:微博关于共同关注(数学中为并集),数字集合类(差集、交集、并集)

差集:(sdiff key otherkey)—>key为参照物,去掉与otherkey相同的元素
深入理解Redis
交集:(sinter key otherkey)—>key与otherkey共同的部分
深入理解Redis
并集:(sunion key otherkey)—>key与otherkey的全部元素
深入理解Redis

有序集合(Zset)

在set的基础上,增加了一个值,set k1 v1 —>zset k1 score1 v1
案例思路:set排序 存储班级成绩表,工资表排序,排行榜应用实现
普通消息,1/ 重要消息,2,带权重进行判断

1:(zadd key 1 value)命令新增一个元素,1代表顺序;(zadd key 1 value 2 value)命令新增多个元素,1、2代表顺序;(zrange key 0 -1)命令获取全部元素

深入理解Redis

2:(zrangebyscore key -inf +inf)命令按照score排序,从小到大,-inf负无穷,+inf正无穷,-inf与+inf也可以是具体的数字,顺序不可颠倒

深入理解Redis

3:(zrangebyscore key -inf +inf withscores)命令比较上一条多一个score数据

深入理解Redis

4:(zrem key value)命令移除集合中的元素

深入理解Redis

5:(zcard key)命令获取有序集合元素的个数值

深入理解Redis

6:(zrevrange key 0 -1)命令从大到小进行排序,反转

深入理解Redis

7:(zcount key scorestart scoreend)命令获取指定区间的成员数量

深入理解Redis


总结

每天一个提升小技巧!!!