前所未见,带你从基础开始深入理解Redis

一、NoSQL 数据库概述

1.1、定义、特点

NoSQL,(Not Only SQL),泛指,非关系型数据库。不依赖业务逻辑的存储方式,是以 key-value 的形式存储数据的,大大增加了数据库的扩展能力!他的排名也算是比较靠前的(数据库排名);

  • 它不遵循 SQL 标准;
  • 不支持 ACID (即四个特性:原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability));
  • 性能远超 SQL;

1.2、NoSQL适用场景

  • 适用于海量数据的读写
  • 对数据高并发的读写
  • 对数据的高可扩展性

二、Redis 的概述、安装教程

2.1、概述

  • Redis 是一个开源的 key-value 存储系统;
  • 和 Memcached 类似,它是支持存储的 value 类型相对更多,包括 string(字符串)、list(链表)、Set(集合)、zset(sorted set --有序集合)和 hash(哈希类型);
  • 这些数据类型都支持 push/pop、add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的;
  • 在此基础上,Redis 支持各种不同方式的排序;
  • 与 memcached 一样,为了保证效率,数据都是缓存在内存中;
  • 区别的是 Redis 会周期性地把更新的数据写入磁盘或者把修改操作写入追加的记录文件;
  • 并且在此基础上实现了 master-slave(主从)同步;


 

2.2、安装教程

2.2.1、下载 Linux 版本的 Redis

Redis 官网

2.2.2、安装 gcc 运行环境

先查看 linux 中是否存在 gcc,是否需要更新;

# 查看命令
gcc --version

安装命令(通过yum来进行安装);

yum install gcc

2.2.3、解压下载下来的安装包(这里的版本是 redis-6.2.6.tar.gz )

运行解压命令;

tar -zxvf redis-6.2.6.tar.gz

解压好之后进入其目录进行编译操作;

cd redis-6.2.6
make

前所未见,万字长文带你从基础开始深入理解Redis

2.2.4、编译之后,执行 install 命令

make install

2.2.5、测试启动

1)启动(终端前台启动,不推荐。启动了之后不能关闭终端,终端关闭,服务停止)

安装完成后来到 /use/local/bin,进入到主目录查看;

cd /usr/local/bin

前所未见,万字长文带你从基础开始深入理解Redis

redis-servere

前所未见,万字长文带你从基础开始深入理解Redis

2)后台启动

后台启动需要一点点配置,首先来到刚解压安装编译的位置(我自己的路径,根据需求修改即可);

cd /home/zyd/redis/redis-6.2.6

这条路径下会有一个 redis.conf 的文件,将其赋值一份到其他路径下(我这里就暂且拷贝当这个位置 /etc 路径下);

cp /home/zyd/redis/redis-6.2.6/redis.conf  /etc/redis.conf

拷贝完成后,修改redis.conf 中的选项,将 daemonize 改为 yes 即可;

前所未见,万字长文带你从基础开始深入理解Redis

回到解压的位置(带文件)启动

redis-server /etc/redis.conf

Redis 出现了一些问题,启动后无法正常地实现存到磁盘任务的问题,解决方案如下:

将配置项 stop-writes-on-bgsave-error 设置为 no ,可以在 Redis 命令行里的配置,也可以在 redis.conf 配置文件里改;

启动就到这里就可以跟安装启动部分告一段落 了!


三、Redis 的五大常用数据类型

3.1常用、通用的命令

查看当前库所有 key;

keys * 	

判断某个 key 是否存在;

exists key

查看你的 key 是什么类型;

type key

删除指定的 key 数据;

del key

根据 value 选择非阻塞删除(仅将 keys从 keyspace 元数据中删除,真正的删除会在后续异步操作);

unlink key

10 秒钟:未给定的 key 设置过期时间;

expire key 10   

查看还有多少秒过期,-1 表示永不过期,-2 表示已过期;

ttl key 

命令切换数据库 例如 select 0 代表切换到0库;

select

查看当前数据库的key的数量;

dbsize

清空当前库;

flushdb

通杀全部库;

flushall

3.2、Redis 字符串 String

String 是 Redis 的最基本数据类型,就是一个典型的 key-value 对儿,String 是二进制安全的,这就意味着你可以存放任何数据到 Redis 的 string 中,包括序列化的对象,以及图片等等。一个字符串的最大占用内存是 512M

3.2.1、常用命令

添加一个键值对;

set key value

查询对应的键的值;

get key

追加对应 key 的值;

append key value...

获得值得长度;

strlen key

只有在 key 不在的时候设置值;

setnx key values

将key中存放的数字进行自增1操作,如果为空,新增值为 -1;

incr key
decr key

自增自减可以自定义步长;

incrby key 2
decrby key 1

设置/获取一对或者多个键值对的值;

mset k2 value2 k3 value3 k4 value4 k5 3

mget k1 k2 k3 k4 k5

只有在 key 不在的时候设置值(基于他的原子性,有一个失败,就都失败);

msetnx  k2 value2 k3 value3 k4 value4 k5 3

根据给定的范围获取值(值得范围是左闭右闭),类似于 Java 中的 substring( ) 方法;

getrange k2 0 -1   获取全部
getrange k2 0 3		0-3一共四个字符

根据给定的位置开始覆盖写值;

get k2		-> value2
setrange k2 0 test
get k2		-> teste2

设置键值的同时,设置过期时间(单位为秒);

setex key 5 value

设置新值的同时获得旧值;

getset key value

3.3、Redis 列表 List

Redis 的 list 是单键多值,即一个键可以对应一个或者多个值。Redis 是一个简单的字符串列表,按照插入顺序排序。他的底层是一个双向链表,所以你可以在链表的头部和尾部插入元素,下面有简单示例;

前所未见,万字长文带你从基础开始深入理解Redis

3.3.1、常用命令

从左边或者右边插入一个或多个值(并非键值对);

lpush/rpush  k1 v1 v2 v3

从左边或者右边弹出一个值;特点:值在,键在,值无,键亡

lpop/rpop key

从k1右边弹出一个值插入到左边的k2中(右弹左压);

rpoplpush  k1(右弹) k2(左压)

按照索引下标获得元素;

lrange key start end
lrange k5 0 3		共四位
lrange k5 0 -1  代表全部

按照索引下标从左向右开始查找对应下标的值;

lindex k5 0

在指定值得前面插入一个新值;

linsert key before lilei newvalue

从左边开始删除 n 个 value;

lrem key n vakue

将列表 key 下标为 index 的值换为 value;

lset key index value

3.3.2、数据结构

List 的数据结构quickList;首先,在元素比较少的时候,会使用一块连续的内存存储,这个结构是 ziplist,称之为压缩列表。他讲所有的元素紧紧挨着一起存储,分配的是一块连续对的存储。当数据量比较多的时候,才会改成 quicklist

因为普通的链表需要附加指针的空间很大,会比较浪费空间。Redis 将链表个 ziplist结合起来组成了 quicklist,也就是使用双向指针将 ziplist穿起来使用,解决了快速插入删除的性能问题,又不会出现太大的数据冗余!

前所未见,万字长文带你从基础开始深入理解Redis

3.4、Redis 集合 Set

Redis Set对外提供的功能是与 list 是类似的,特殊之处在于 Set 是可以自动排重的,也就是说,当你需要一个列表数据,又不希望出现重复数据,就可以选择使用 Set,Set 提供了判断某个成员是否在一个 set 集合内的重要接口,这个也是 list 所不能够提供的

Redis 的 Set 是 string 类型的无序集合,它底层其实是一个 value 为 null 的 hash 表,所以添加、查找、删除的复杂度都是 o(1);

3.4.1、常用命令

添加一个或多个值到 Set 集合中;

sadd key value1 value2...

返回该键的所有值(并不是删除);

smembers key

返回该集合的元素个数;

scard key

删除结合中的一个或多个元素;

srem key value1 value2...

从该集合中随机 弹出一个值;

spop key

从该集合中随意取出 n 个值,但是不会从集合中删除;

srandmember key n

把集合中的一个值从 source 集合移动到另一个集合destination;

smove source destination value

返回两个或多个集合的交集;

sinter key1 key2

返回两个集合或多个集合的并集;

sunion key1 key2

返回两个集合的差集元素(key1 有但是 key2 没有,也就是 key1 - key2);

sdiff key1 key2

3.4.2、数据结构

Set 数据结构对应的是 dict 字典,字典是用哈希表实现的;而 Java 中的 HashSet 的内部实现使用的是 HashMap,只不过所有的 value 都只想同一个对象,Redis 的 Set 结构也是一样的,它的内部也使用 hash 结构,所有的 value 都指向同一个内部值;

3.5、Redis 哈希 Hash

Redis Hash 是一个键值对集合,他是一个 string 类型的 field 和 value 的映射表。类似于 Java 里的 Map<String,Object>,所以 Hash 特别适合用于存储对象;如下图所示

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值