【Redis】Linux安装redis及五大数据类型
Hi,大家好,我是抢老婆酸奶的小肥仔。
在日常开发中,我们或多或少都会使用到NoSQL数据库,常用的有MongoDB,Redis等,其中Redis应该是使用比较广泛的一种非关系型数据库。下面我们从最基础开始,来学学Redis吧,希望对大家有所帮助。 不废话,直接开干。
1、在usr/locate下创建redis目录
cd /usr/local
mkdir redis
2、下载安装包并上传到redis目录
redis安装包的下载路径:download.redis.io/releases/
3、解压安装包,安装gcc
tar -zxvf redis-6.2.1.tar.gz
yum install gcc
4、编译redis
make && make install
编译完成后,在/usr/local/bin目录下查看安装目录:
.redis-benchmark
:性能测试工具
.redis-check-aof
:修复有问题的AOF文件
.redis-check-dump
:修复有问题的dump.rdb文件
.redis-sentinel
:redis集群使用
.redis-server
:redis服务器启动命令
.redis-cli
:客户端,操作入口
5、redis操作
5.1 redis启动
5.1.1 前台启动
前台启动直接使用redis-server
进行启动,这样在窗口关闭后redis会跟随窗口一起关闭
5.1.2 后台启动
后台启动时,不会跟随窗口的关闭而关闭redis
步骤:
1、复制redis.conf文件到/etc目录
cp /usr/local/redis/redis-6.2.1/redis.conf /etc/
2、修改/etc/redis.conf中的配置,将后台启动设置daemonize改成yes,即将其改成守护线程。
daemonize yes
3、启动redis
redis-server /etc/redis.conf
4、查看redis进程,确定是否正常启动
ps -ef|grep redis
5.2 关闭redis
1、 直接kill kill -9 pid
2、redis-cli shutdown
5.3 进入redis命令窗口
执行redis-cli
进入redis命令窗口,执行redis命令
redis-cli
5.4 redis命令
参考当前链接文档:doc.redisfans.com/
5.6 redis的介绍
- 默认端口6379
- 默认16个数据库,下标从0开始
- 使用select 来切换数据库
- 统一密码管理,所有库密码相同
- dbsize:查看当前数据库key的数量
- flushdb:清空当前库
- flushall:清空所有库
- redis是单线程+多路IO复用
多路复用:使用一个线程来检测多个文件描述符(socket)的就绪状态,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞到超时,得到就绪状态后进行真正的操作,操作可以在同一个线程里,也可以启动线程执行。
注:redis6.0中提供了多线程,命令解析和IO数据读写这部分采用多线程,命令的执行还是采用单线程,多个客户端发送命令在同一个线程去执行,相当于排队执行,效率极高。
5.7 redis五大数据类型
string
:数据结构为简单动态字符串(Simple Dynamic String 缩写SDS),可以修改字符串,内部结构类似于ArrayList,采用分配冗余空间的方式来减少内存的频繁分配。
如图:capacity为内部为当前字符串实际分配的空间,比实际字符串len要长。
- 当字符串长度小于1M时,则双倍扩展现有空间
- 当字符串长度大于1M时,则会多扩容1M空间
List
:数据结构为快速链表quickList
- 当列表元素较少时,使用一块连续的内存存储,即ziplist,将所有元素紧挨着一起存储,分配一块连续的内存
- 当列表元素较多时,则改成quickList,即链表与ziplist结合起来,也就是通过双向指针将ziplist串起来
set
:数据结构是字典,字典采用hash表实现,内部使用hash结构,所有的Value都指向同一个内部值。hash
:数据结构是ziplist(压缩列表)、hashtable(哈希表)
- filed-value较短,个数较少时,使用ziplist
- filed-value较长,个数较多时,使用hashtable
zset
:与set相似,但会给每个成员关联一个评分(score)根据,这个评分从低到高的方式排序。 集合成员唯一,评分可重复
数据结构使用两种。
- hash表:类似Map<String,score>,key:集合的元素,value:元素对应的score,可以快速定位元素定义的score,时间复杂度为O(1);
- 跳表(skiplist):插入、删除】查找复杂度为O(logN)。类似ConcurrentSkipListSet,根据score的值排序后生成一个跳表,可以快速按照位置的顺序或score的顺序查询元素。
跳表原理:
根据排序的数据,挑选出一定的值组成索引,查询时减少查询的次数。
首先从考虑一个有序表开始:
从该有序表中搜索元素 < 23, 43, 59 > ,需要比较的次数分别为 < 2, 4, 6 >,总共比较的次数为 2 + 4 + 6= 12 次。有没有优化的算法吗? 链表是有序的,但不能使用二分查找。类似二叉搜索树,我们把一些节点提取出来,作为索引。得到如下结构:
这里我们把 < 14, 34, 50, 72 > 提取出来作为一级索引,这样搜索的时候就可以减少比较次数了。我们还可以再从一级索引提取一些元素出来,作为二级索引,变成如下结构:
这里元素不多,体现不出优势,如果元素足够多,这种索引结构就能体现出优势来了。
redis的安装及基础数据类型就先说到这,希望对大家有帮助,谢谢大家。
参考: 《Redis全套学习笔记》 -- 作者:路人
转载自:https://juejin.cn/post/7233177170491244600