当前位置:首页 » 《随便一记》 » 正文

redis学习第一天

22 人参与  2022年12月21日 08:09  分类 : 《随便一记》  评论

点击全文阅读


NoSQL数据库概述

NoSQL(Not Only SQL),意思是不仅仅是SQL,泛指非关系型数据库。NoSQL不依赖业务逻辑方式存储,而是以简单的key-value模式存储。因此大大的增加了数据库的扩展能力。
(1)不遵循SQL标准
(2)不止ACID(原子性、一致性、隔离性、持久性)
(3)远超出SQL的性能

NoSQL使用场景及不使用场景

(1)适用场景
对数据高并发的读写
海量数据的读写
对数据高可扩展性的
(2)NoSQL不使用场景
需要事务支持
基于sql的结构化查询存储,处理复杂的关系,需要即席查询

Redis相关知识介绍

(1)默认16个数据库,类似数组下标从0开始,初试默认使用0号库。
(2)使用命令select <dbid>来切换数据库,如:select 8
(3)统一密码管理,所有库相同密码
(4)dbsize 查看当前数据库的key的数量
(5)flushdb 清空当前库
(6)flushall 通杀全部库
(7)Redis是单线程+多路IO复用技术

多路复用技术

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

Redis键(key)

keys * 查看当前库所有key
exist key 判断某个key是否存在
type key 查看key是什么类型
del key 删除指定的key数据
unlink key 根据value选择非阻塞删除(仅仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作)
expire key 10 10秒钟:为给定的key设置过期时间
ttl key 查看还有多少秒过期,-1表示永不过期,-2表示已经过期

select 命令切换数据库
dbsize查看当前数据库的key的数量
flushdb 清空当前库
flushall 通杀全部库

set key value
append key value 将给定的value追加到原本值的末尾
strlen key 获取值的长度
setnx key value 只有在key 不存在的时候,设置key的值
incr key 将key中存储的数字值加1,只能对数字值进行操作,如果为空,新增值为1
decr key 将key中存储的数字值减一,只能对数字值操作,如果为空,新增值为-1
incrby/decrby key 步长 将key中存储的数字值递增减,自定义步长。

mset key1 value1 key2 value2 同时设置一个或者多个键值对
mget key1 key2 key3 同时获取一个或者多个value
setnx key1 value1 key2 value2 同时设置一个或者多个key value,当且仅当所有给定的key都不存在
原子性,有一个失败则都失败

getrange key 起始位置 结束位置
获取值的范围,类似java中的substring
setrange key 起始位置 value
用value覆写 key所存储的字符串值,从起始位置开始(索引从0开始)

setex key 过期时间 value
设置键值的同时,设置过期时间,单位秒
getset key value
以新换旧,设置了新值同时获取旧值

lpush/rpush key value1 value2 value3 从左边、右边插入一个或者多个值
lpop/rpop key 从左边/右边吐出一个值 值在健在,值光键亡

rpoplpush key1 key2 从key1列表右边吐出一个值,插入到key2列表左边

lrange key start end
lindex key index 按照索引下标获取元素(从左到右)
llen key获取列表长度

原子性操作

所谓原子操作是指不会被线程调度机制打断的操作
这种操作一旦开始,就一直运行到结束,中间不会有任何context switch(切换到另一个线程)。
(1)在单线程中,能够在单条指令中完成的操作都可以被认为是原子操作,因为中断只能发生在指令之间。
(2)在多线程中,不能被其他进程(线程)打断的操作就叫作原子操作。
Redis单命令的原子性主要得益于Redis的单线程。

Redis列表的数据结构

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

Redis有序集合Zset(sorted set)简介

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

Redis数据类型:Bitmaps

(1)Bitmaps本身不是一种数据类型,实际上它就是字符串(key-value),但是它可以对字符串进行位操作。
(2)Bitmaps单独提供了一套命令,所以在Redis中使用Bitmaps和使用字符串的方法不太相同,可以把Bitmaps想象成一个以位为单位的数据,数组的每个单元只能存储0和1,数组的下标在Bitmaps中叫做偏移量。

Redis数据类型:HyperLogLog

Redis中HyperLogLog是用来做基数统计的算法,HyperLogLog的优点是,在输入元素的数量或者体积非常大时,计算基数所需要的空间总是固定的,并且是很小的。
在Redis里面,每个HyperLogLog键只需要花费12KB内存,就可以计算接近2^64个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为HyperLogLog只会根据输入元素计算基数,而不会存储输入元素本身,所以HyperLogLog补鞥呢像集合那样,返回输入的各个元素。


点击全文阅读


本文链接:http://zhangshiyu.com/post/50085.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1