提示:以下是本篇文章正文内容,下面案例可供参考
REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库
单线程+多路IO复用,支持持久化,支持多种数据类型
当我们点击官网的Download我们会进入下载界面:出现Redis Stack,那么Redis 和 Redis Stack是什么关系呢
Redis Stack 是什么?
Redis Stack 是一组软件套件,它主要由三部分组成。一个是 Redis Stack Server,一个是 RedisInsight,一个是 Redis Stack 客户端 SDK。
其中 Redis Stack Server 由 Redis,RedisSearch,RedisJSON,RedisGraph,RedisTimeSeries 和 RedisBloom 组成。
其目的:基于Redis的搜索、文档、图和时间序列功能整合到一个扩展Redis Stack中,以使开发人员能够轻松构建实时应用程序。
总结:Redis Stack 更强调它的目的是构建实时应用程序,它不是 redis 的替代品,它和 redis 将会一同发展。
在官网下载的是Linux版的
官网下载https://redis.io/download/
下载后通过winscp上传到linux的 /opt目录下
Redis是C语言编写的,所以需要gcc编译环境
查看gcc的版本:
如果没有gcc编译器,需要进行安装通过 yum install gcc命令
并且Redis 6需要gcc版本至少是gcc7以上
解压文件:
解压成功
通过make命令进行编译
通过make install命令进行安装
安装成功后,会自动默认安装到 /usr/local/bin路径下
redis的启动分为两种方式:前台启动和后台启动。
由于前台启动后,命令行界面不能再执行其他操作,且命令行界面关闭后,redis也会随即关闭,所以不推荐使用。
redis前台启动,直接输入redis-server
按Ctrl +c退出
配置文件redis.conf 文件
复制文件到etc/下
查看文件是否存在
修改配置文件(让服务可以在后台启动)
默认端口号6379
默认16个数据库,初始默认使用0号库(所有库同样密码)
安装成功后,默认配置此环境变量
常用的key操作命令:
set key value 设置key,及对应的value
keys * 查看库中所有的key
exists key 查看库中是否存在该key
type key 查看key所属的类型
del key 删除指定的key
unlink key 根据value选择非阻塞删除(仅在keys从keyspace元数据中删除,真正的删除在后续的异步操作)
ttl 返回key的过期时间(-1表示永不过期,-2表示已过期)
dbsize 查看库中有多少个key
flushdb 清空当前库
flushall 通杀全部库
String是redis最基本的数据类型,一个redis中的字符串value最多可以是512m
String类型是二进制安全的,jpg图片,序列化对象
set 和get命令
append追加
strlen 得到value的长度
setnx指定的 key 不存在时,为 key 设置指定的值(返回值为1被设置,0则未设置)
incr 和decr
将 key 中储存的数字值增一(减一)
incr 原子操作
所谓的原子操作是指不会被线程调度机制打断的操作
(1)在单线程中,能够在单条指令中完成的操作都可以认为是原子操作,因为中断只能发生于指令之间。
(2)在多线程中,不能被其他进程(线程)打断的操作就叫做原子操作。
redis单命令的原子性主要得益于redis的单线程
incrby 和 decrby
将 key 中储存的数字加上(减上)指定的增量值
mget/mset/msetnx
字符串的截取、替换
setex将键 key 的值设置为 value , 并将键 key 的生存时间设置为 seconds 秒钟。
getset得到旧值,设置新值
String 的数据结构为简单动态字符串(SDS) 内部结构实现类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。
list 单键多值
redis列表是简单的字符串列表,按照插入顺序排序,它的底层实际上是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能较差
从列表右边吐出一个值,插到列表右边
lrem 从左边删除n个value
lset 将key下标为index的值替换成value
list的数据结构为快速链表 quickList
首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist压缩列表,它将所有的元素紧挨着一起存储,分配的是一块连续的内存
当数据量比较多的时候才会改成quicklist
因为普通的链表需要的附加指针空间太大,会比较浪费空间。(比如这个列表只存的是int类型的数据,结构上还需要两个额外的指针prev和next)
将多个ziplist使用双向指针串起来使用,既满足了快速的插入删除性能,又不会出现太大的空间冗余。
set和list类似,只不过set是可以自动排重的,并且提供了判断某个成员是否在一个set集合内
set是string类型的无序集合,它的底层其实是个value为null的hash表,添加等的复杂度都是o(1)
一个算法,随着数据的增加,执行时间的长短,如果是o(1)s数据增加,查找数据的时间不变。
set的数据结构是dict字典,字典是用哈希表实现的
hash是一个键值对集合,是一个string类型的field和value的映射表,特别适合用于存储对象
类似于Java里面的Map
hash类型对应的数据结构是两种:ziplist(压缩列表) hashtable(哈希表)
当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable
Redis有序集合 Zset与普通集合set非常相似,是一个没有重复元素的字符串集合。
不同之处是有序集合的每个成员都关联了一个评分(score),这个评分被用来按照从低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复的。
因为元素是有序的,所以你可以根据评分或者次序来获取一个范围的元素
zadd <\key> <\sore1><\value1> | 将一个或者多个元素及其score值加入到集合中 |
zrange <\key> <\start><\stop><\withscores>< | 返回有序集合下标<\start><\stop>的元素 |
zrangebyscore key min max | 返回集合中,score值介于min和max之间(包括自己)的成员,有序集合score从小到大递增 |
zrevrangebyscore key max min | 同上改为从大到小排列 |
zincrby key | 为元素的score加上增量 |
zrem key value | 删除该集合下,指定的元素 |
zcount key min max | 统计该集合,分数区间内的元素个数 |
zrank key value | 返回该值在集合中的排名,从0开始 |
实例:
zset 底层使用了两个数据结构
可以看做成一个以位为单位的数组,数组的每一个单元只能存储0和1,数组的下标在Bitmaps中叫做偏移量
如果用户的id以一个指定的数字(例如1000)开头,直接将用户的id和Bitmaps的偏移量对应势必会造成一定的浪费,通常是每次做setbit操作时将用户id减去这个指定的数字
在第一次初始化Bitmaps时,假如偏离量非常大,那么整个初始化过程执行会比较慢,可能会造成Redis的阻塞
实例操作:
注意:redis的setbit设置或清除的是bit的位置,而bitcount计算的是byte位置
bitop operation destkey key [key…] 对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。
operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种:
HyperLogLog是用来做基数统计的算法,在输入元素的数量或者体积非常大时,计算基数所需的空间是固定的,并且是很小的。在redis中,每个HyperLogLog键只需要花费12kb内存就可以计算接近2^64个不同元素的基数。
但是,HyperLogLog只会根据输入元素来计算基数,并不储存输入元素本身,所以HyperLogLog不能像集合那样,返回输入的各个元素
Redis在3.2中增加了对GEO(Geographic地理信息)类型的支持,就是元素的二维坐标,在地图中就是经纬度。
有效的经度从-180度到180度,有效的纬度从-85.05002878度到85.05112878度,当坐标位置超出指定范围时,该命令将会返回一个错误。已经添加的数据是无法再次往里面添加的。两级无法直接添加。