首页 > 数据库 >Redis 6 学习笔记1 ——NoSQL数据库介绍,Redis常用数据类型

Redis 6 学习笔记1 ——NoSQL数据库介绍,Redis常用数据类型

时间:2023-01-12 20:12:25浏览次数:54  
标签:存储 NoSQL Redis 数据库 元素 数据类型 value

NoSQL数据库介绍(了解)

技术的分类
1、解决功能性的问题:Java、Jsp、RDBMS、Tomcat、HTML、Linux、JDBC、SVN,
2、进一步地,解决系统功能扩展性的问题:Struts、Spring、SpringMVC、Hibernate、Mybatis.
3、最后,随着服务器压力加大,要解决系统性能的问题:NoSQL、Java线程、Hadoop、Nginx、MQ、ElasticSearch,.

NoSQL数据库概念、特点和场景

NoSQL(Not Only SQL),泛指非关系型的数据库。它不依赖业务逻辑方式存储,而以简单的key-value模式存储,因此大大增加了数据库的扩展能力。

常见的NoSQL数据库有Redis、MongoDB、Memcache、HBase、Cassandra(后两个是大数据技术用的)。

NoSQL数据库不遵循SQL标准(有着自己的一套操作),不支持事务的ACID基本特性(不代表不支持事务),有着远超于SQL的性能

它打破了传统关系型数据库以业务逻辑为依据的存储模式而针对不同数据结构类型改为以性能为最优先的存储方式。

适用场景

1、对数据高并发的读写
2、海量数据的读写
3、系统高可扩展性

可扩展性补充说明:如果我用一台计算机解决了一些问题,当我买了第二台计算机,我只需要一半的时间就可以解决这些问题,或者说每分钟可以解决两倍数量的问题。两台计算机构成的系统如果有两倍性能或者吞吐,就是我说的可扩展性。我们希望可以通过增加机器的方式来实现扩展,但是现实中这很难实现,需要一些架构设计来将这个可扩展性无限推进下去。

不适用场景

1、需要事务支持。

不过Redis确实可以进行事务处理(但是它不支持事务回滚)。这时候就要回忆事务的原子性、一致性、隔离性、持久性是什么了。

REDIS 事务处理 -- Redis中国用户组(CRUG)

2、基于sql的结构化查询存储,处理复杂的关系,需要即席查询(即席查询是用户根据自己的需求,灵活的选择查询条件,系统能够根据用户的选择生成相应的统计报表)。·
3、(用不着sql的和用了sql也不行的情况,请考虑用NoSql)

Redis介绍

特点:

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

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

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

默认16个数据库,类似数组下标从0开始,初始默认使用0号库

使用命令select<dbid>来切换数据库。如:select 8
统一密码管理,所有库同样密码。
dbsize 查看当前数据库的key的数量
flushdb 清空当前库
flushall 通杀全部库

技术方面

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

多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态,比如调用select和poll函数,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞直到超时

得到就绪状态后进行真正的操作可以在同一个线程里执行,也可以启动线程执行(比如使用线程池)。学过计组和操作系统并不难理解这些概念。

命令和数据类型

Redis命令中心(Redis commands) -- Redis中国用户组(CRUG)

常用数据类型:String、Set、Lists、Hash、Zset(也叫Sorted Set)

6.0版本三个新增的数据类型:HyperLogLog、Geospatial(Geo)、BitMap(相对来说是重点,是实现布隆过滤器的基础)

命令没什么好说的,只能是要知道上面各个组是指代什么,查文档熟能生巧。

各个数据类型的文档:

(1)五大数据类型概述:REDIS data-types -- Redis中文资料站 -- Redis中国用户组(CRUG)

(2)数据类型的详细说明(HyperLogLog和BitMap在后半部分,是英文):REDIS data-types-intro -- Redis中文资料站 -- Redis中国用户组(CRUG)

(3)Geospatial说明:这是专门用于地理空间位置的东西(纬度、经度、名称)

对各组命令的一些说明和注意点:

1、Keys是对键值对的的操作

2、del 命令和unlink 命令类似,但是有区别。

删除是需要消耗时间的,可以先在逻辑上删除再保证业务进行的同时慢慢删掉,避免删除的并发太多导致操作阻塞或等待。

数据类型部分特点说明

1、incr命令可以操作string类型的键值对的值(数字)加一,这是原子操作,那么java的i+1是不是原子操作

这个操作首先要把i+1的值存到一个寄存器,然后再将它赋予i,所以不是原子操作。准确来说反编译字节码文件后可以看到i++是4步,++i是3步,java里的i++是3步因为底层被优化了。

2、string的二进制安全就是,字符串不是根据某种特殊的标志来解析的,无论输入是什么,总能保证输出是处理的原始输入而不是根据某种特殊格式来处理。

REDIS字符串-二进制安全的含义_昭告天下的博客-CSDN博客_redis字符串二进制安全

3、List的底层是一个双向链表,准确来说是quickList,它在两端的插入删除效率很高,但查询列表中间的元素是非常慢的。List相当于1个key对多个value,如果没有value了,key也就无了。

quickList就是一个标准的双向链表的配置,有head 有tail;
每一个节点是一个quicklistNode,包含prev和next指针(对比linkedList)
每一个quicklistNode 包含 一个ziplist,*zp 压缩链表里存储键值。
所以quicklist是对ziplist进行一次封装,使用小块的ziplist来既保证了少使用内存,也保证了性能。

Redis列表list 底层原理 - 知乎 (zhihu.com)

4、Redis的Set是string类型的无序集合底层实际是一个value为null的hash表(就是说hash表中的key是Set中的值,value为null),

所以添加,删除以及测试元素是否存在 的操作时间复杂度都是O(1)。查找则是O(logn)

Set集合的spop是随机从集合中吐出一个元素

Redis中hash、set、zset的底层数据结构原理 - 腾讯云开发者社区-腾讯云 (tencent.com)

5、Redis hash可以类比Java中的Map<String, Object>,它的key也是不重复的。hash适合用来存储对象,并且底层是ziplist和hashtable的组合(field-value长度较短且个数较少时用ziplist,否则用hashtable,类比前面的List)

6、Zset和Set相比多了个自动排序的功能(相当于排行榜) ,也就是说成员唯一,分数可重复,添加,删除和更新元素的操作的时间复杂度是O(logn),访问集合的中间元素也非常的快,底层用了hash和跳跃表。hash作用是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。

Redis数据结构——跳跃表 - Mr于 - 博客园 (cnblogs.com)

7、BitMap本身不是一种数据类型,实际上它本质就是字符串。通过特殊的命令,你可以将 String 值当作一系列 bits 处理:可以设置和清除单独的 bits,数出所有设为 1 的 bits 的数量,找到最前的被设为 1 或 0 的 bit,等等。可以把Bitmaps想象成一个以位为单位的数组,数组的每个单元只能存储0和1,数组的下标在Bitmaps中叫做偏移量。

  位操作分为两组:常量时间单位操作,如将位设置为1或0,或获取其值;以及对位组的操作,例如在给定的位范围内计算设置位的数量(例如,人口计数)。

  位图的最大优势之一是,在存储信息时,它们通常可以极大地节省空间(因为一个String值最大长度是512MB,也就是可以操作2^32个不同的位)。例如,在一个由增量用户id表示不同用户的系统中,仅使用512 MB内存就可以记住40亿用户的单个比特信息(例如,知道用户是否想要接收时事通讯,是否访问过某个网站)。

很多应用的用户id以一个指定数字(例如第一个用户id是10000)开头,直接将用户id和Bitmaps的偏移量对应势必会造成一定的浪费,通常的做法是每次做setbit操作时将用户id减去这个指定数字。

bitcount可以指定范围,结合下面看就知道了。此外bitop算是对它的一个补充,可以对两个以上的字符串进行AND、OR、NOT(这个除外)、XOR的操作,但时间复杂度是O(logn)。具体见文档。

在第一次初始化Bitmaps时,假如偏移量非常大,那么整个初始化过程执行将会比较慢,可能会造成Redis的阻塞

8、HyperLogLog主要用于统计相关的功能需求。比如统计网站PV(PageView页面访问量),可以使用Redis的incr、incrby轻松实现。但是像UV(UniqueVisitor,独立访客)、独立IP数、搜索记录数等需要去重和求和的问题如何解决?这种求集合中不重复元素个数的问题称为基数问题。而基数估计就是在误差可接受范围内,快速计算基数。

解决基数问题有很多种方案:

(1)数据存储在MySQL表中,使用distinct count 计算不重复个数

(2)使用Redis提供的hash、set、bitmaps等数据结构来处理。

以上的方案结果精确,但随着数据不断增加,导致占用空间越来越大,对于非常大的数据集是不切实际的。

能否降低一定的精度来平衡存储空间?Redis推出了HyperLogLog,它是用来做基数统计的。其优点是在输入元素的数量或者体积非常大时,计算基数所需的空间总是固定的、很小的。

在Redis里面,每个HyperLogLog键只需花费12KB内存,就可以计算接近2^64个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

但是,因为HyperLogLog只会根据输入元素来计算基数,而不会存储输入元素本身,所以HyperLogLog不能像集合那样,返回输入的各个元素。

9、Geospatial

Redis3.2中增加了对GE0类型的支持。GE0,Geographic,地理信息的缩写。

该类型就是元素的2维坐标,在地图上就是经纬度。Redis基于该类型,提供了经纬度设置,查询,范围查询,距离查询,经纬度Hash等常见操作。

补充:其它类型的NoSQL数据库(了解)

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

行式数据库

列式数据库

HBase、Cassandra都属于这类。

图关系型数据库

Neo4j是图关系型数据库,主要应用是社会关系、公共交通网络、地图及网络拓扑

参考博客

论文里常出现的可扩展性(Scalability)是什么意思呢?_dream_uping的博客-CSDN博客_可扩展性

标签:存储,NoSQL,Redis,数据库,元素,数据类型,value
From: https://www.cnblogs.com/joey-redfield/p/17035691.html

相关文章

  • Redis-独立功能-排序
    排序Redis的SORT命令可以对列表键、集合键或者有序集合键的值进行排序。如果按照选项来划分的话,一个SORT命令的执行过程可以分为以下几步:1)排序:在这一步,命令会使用ALPHA......
  • Redis-独立功能-事务
    事务事务的实现Redis通过MULTI、EXEC、WATCH等命令来实现事务(transaction)功能。事务提供了一种将多个命令请求打包,然后一次性、按顺序地执行多个命令的机制,并且在事务执......
  • 使用redis实现自增序列
    来源:https://www.cnblogs.com/shigj/p/11215262.htmlpublicclassTestService{ @Resource RedisTemplate<String,Object>redisTemplate; publicStringgetI......
  • Redis-独立功能-发布与订阅
    发布与订阅Redis的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。通过执行SUBSCRIBE命令,客户端可以订阅一个或多个频道,从而成为这些频道的订阅者(subscribe......
  • 【一句话】Redis的3中缓存策略
    首先一句话:旁路缓存模式策略:写->写DB,删缓存,读->读cache,没有则读DB,然后更新到缓存读写穿透策略:写->写缓存,然后由缓存系统写DB,读->读cache,没有则将DB写入cache,再读cache异......
  • Redis-多机数据库-集群
    集群Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能。Redis服务器在启动时会根据cluster-enabled配置选项是否为y......
  • redis命令清理key
    ###手动清除单个key:redis-cli-h'ipaddr'-p6379-a'passwd'-n0keys'keyName'|xargsredis-cli-h'ipaddr'-p6379-a'passwd'-n0del;或者手动清除单个k......
  • RedisUtil以及可放入Map和List格式的配置
    RedisUtilpackagecom.diit.onemap.common.utils;importorg.springframework.data.redis.core.*;importorg.springframework.stereotype.Service;importjavax.ann......
  • redis 中的 set
    set是String中的无序集合 底层是是value为null的hash表 时间复杂化是o(1);sadd k1v1v2v3 set中添加数据smembersk1取出set中全部的数据sismemberk1v1 ......
  • Redis安装使用
    在开发网页的时候我们难免要发送短信做页面判断Redis就是一个外置存储仓库使用安装Redis安装百度云链接:https://pan.baidu.com/s/1Mvfaxw3J5SOg39V0aZOrHA提取码:n7......