【Redis】Linux安装redis及五大数据类型

347 阅读5分钟

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五大数据类型

  1. string:数据结构为简单动态字符串(Simple Dynamic String 缩写SDS),可以修改字符串,内部结构类似于ArrayList,采用分配冗余空间的方式来减少内存的频繁分配。

如图:capacity为内部为当前字符串实际分配的空间,比实际字符串len要长。

  • 当字符串长度小于1M时,则双倍扩展现有空间
  • 当字符串长度大于1M时,则会多扩容1M空间
  1. List:数据结构为快速链表quickList
  • 当列表元素较少时,使用一块连续的内存存储,即ziplist,将所有元素紧挨着一起存储,分配一块连续的内存
  • 当列表元素较多时,则改成quickList,即链表与ziplist结合起来,也就是通过双向指针将ziplist串起来

  1. set:数据结构是字典,字典采用hash表实现,内部使用hash结构,所有的Value都指向同一个内部值。
  2. hash:数据结构是ziplist(压缩列表)、hashtable(哈希表)
  • filed-value较短,个数较少时,使用ziplist
  • filed-value较长,个数较多时,使用hashtable
  1. 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全套学习笔记》 -- 作者:路人