Redis学习笔记

自学完 redis 后并不理解其中的相关概念,现在重新整理成博客当作笔记使用!(侵删...)		

1.NoSQL

1.1 什么是NoSQL?
NoSQL = Not Only SQL (不仅仅是SQL) ,也解释为non-relational(非关系型数据库)。在NoSQL数据库中数据之间是无联系的,无关系的,数据结构是松散的,可变的。
1.2 互联网应用的特点/为什么用NoSQL?

 - 访问量大
 - 高并发
 - 高可用
 - 海量数据

1.3 关系型数据库如mysql相比之下的劣势?

  • 无法操作大量集中的高并发操作,关系型数据的是IO密集的应用,硬盘IO是性能的瓶颈
  • 表中存储记录有限,一张表最多拥有256个列

1.4 NoSQL的优势?

  • 大数据量,高性能
  • 灵活的数据模型 :NoSQL数据库存储数据不需要定义表和列 没有表与表之间的关系
  • 高可用
  • 成本低

1.5 NoSQL的劣势?

  • 无关系,数据之间是没有联系的
  • 不支持标准的SQL,没有公认的NoSQL标准
  • 没有关系型数据库的约束,大多数没有索引的概念
  • 没有事务,不能依靠事务实现ACID
  • 没有丰富的数据类型(数值,日期,字符,二进制,大文本等)

2. Redis

2.1 Redis介绍

Redis是当今非常流行的基于K-V结构的作为Cache(缓存)使用的NoSQL数据库。
Redis是一个开源的使用C语言编写,支持网络,可基于内存亦可持久化的Key-Value数据库。Key字符类型,其值(Value)可以是字符串(String),哈希(Map),列表(list),集合(sets),有序集合(sorted sets)等类型,每种数据类型有自己的专属命令,所以他通常也被称为数据结构服务器。官网: http://redis.cn/
 linux环境下使用redis需要在服务器上下载gcc编译器,因为redis是用C语言编写的,没有编译器不能直接运行。redis默认端口号为:6379

**2.2 redis常用命令 **

  • 沟通命令,查看状态
    redis>ping 返回 PONG
    解释:输入ping ,redis 给我们返回PONG,表示redis服务运行正常
  • 查看当前数据库中Key的数目: dbsize
    语法 :dbsize
    作用 :返回当前数据库中Key的数量
  • redis默认使用个库,从0到15,对数据库个数的修改在redis.conf文件中databases 16
  • 切换库命令: select db
    使用其他数据库,命令是 select index
  • 删除当前库中的所有数据 :flushdb (其他库中的数据不受影响)
  • redis 自带的客户端退出当前redis连接 :exit或quit(退出客户端只是退出连接,并没有关闭redis服务)

2.3 redis 操作Key的命令

  • keys
    语法:keys pattern
    作用:查找所有符合模式pattern的Key,pattern可以使用通配符。
    通配符: * :表示0-多个字符,例如:keys * 查询所有的key。 ? :表示单个字符: 例如:wo?d,匹配 word,wood等。
  • exists
    语法:exists key 或者 exists key key key…
    作用:判断key是否存在
    返回值:整数,存在key返回1,其他返回0,使用多个key,返回存在key的数量。(并不能知道具体哪些key返回)
  • expire
    语法:expire key seconds;
    作用:设置key的生存时间,超过时间,key自动删除,单位是秒。
    返回值:设置成功返回1,其他情况返回0。
  • ttl
    语法:ttl key
    作用:一秒为单位,返回key的剩余生存时间,一般与expire连用
    返回值:-1:没有设置key的生存时间,key永不过期。-2:key不存在。数字: key的剩余存活时间,秒为单位。
  • type
    语法:type key
    作用:查看key所存储值的数据类型
    返回值:字符串表示的数据类型 none(key不存在); string(字符串); list(列表); set(集合); zset(有序集合); hash(哈希表)。
  • del
    语法:del key 或 del key key key…
    作用:删除存在的key,不存在的忽略。
    返回值:数字,删除的key的数量。

2.4 redis 的五种数据类型

  • 字符串类型 string
    字符串类型是 redis 中最基本的数据类型,它能存储任何形式的字符串,包括二进制的数据,序列化后的数据。JSON化的对象甚至是一张图片。最大512M。
  • 哈希类型 hash
    edis hash 是一个string 类型的field 和 value 的映射表,hash 特别适合用于存储对象。
  • 列表类型 list
    redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
  • 集合类型 set
    Redis 的 set 是 string 类型的无序集合,集合成员是唯一的,即集合中不能出现重复数据。
  • 有序集合 zset
    Redis 有序集合 zset 和集合 set 一样也是 string 类型元素的集合,且不允许重复的成员。不同的是 zset 的每个元素都会关联一个分数(分数可以重复),redis 通过分数来为集合中的成员进行从小到大的排序。

2.5 Redis 数据类型操作命令
2.5.1 字符长类型(string)

  • 基本命令
    set : 将字符串值 value 设置到 Key 中。
    语法:set key value 。
    get:获取 key 中设置的字符串值。
    语法:get key 注:没有key则返回nil(等同于null)
    incr:将 key中存储的数字值加一,如果key不存在,则创建key并初始化值为0再执行加一操作后返回。注: 只能对数字类型的数据进行操作 且incr操作是原子性的
    decr:将 key中存储的数字值减一,如果key不存在,则创建key并初始化值为0再执行减一操作后返回注: 只能对数字类型的数据进行操作 且incr操作是原子性的
    append :将 value 追加到 key 原来旧值的末尾,如果 key 不存在,则等同于 set 操作,返回值是追加后的字符串的长度
  • 常用命令
    strlen:返回 key 所存储的字符串的长度,如果不存在则返回0
    getrange:获取 key 中字符串值从 start 到 end 结束的子字符串,包括 start 和 end,负数表示从字符串的末尾开始,-1表示最后一个字符。
    语法:getrange key start end
    setrange:用 value 覆盖(替换)key 的存储的值从 offset 开始,不存在的 key 做空白字符串。
    返回值:修改后的字符串的长度
    语法:setrange key offset value
    mset:同时设置一个或多个 key-value ,相当于 set 的批量操作。
    语法:mset key value key value…
    mget:同时获取一个或多个给定 key 的值 。
    语法:mget key key key…

2.5.2 哈希类型(hash)

  • 基本命令
    hset:将哈希表 key 中的域 field 的值设为 value ,如果 key 不存在 ,则新建 hash 表,进行赋值,如果有field 则覆盖值。
    语法:hset hash表中的key field value
    返回值:如果 field 是 hash 表中的新 field 且设置值成功,返回1;如果 field 已经存在,旧值覆盖新值,返回0。
    hget:获取哈希表 key 中给定域 field 的值, field 不存在返回 nil 。
    语法:hget key field
    hmset:hset 的批量操作,成功返回 ok ,失败返回错误。
    语法:hmset key field value field value…
    hmget:hget 的批量操作,不存在返回 nil 。
    语法:hmget key field field …
    hgetall:获取一个哈希 key 中的所有 field 和 value ,不存在返回空哈希。
    语法:hgetall key
    hdel:删除哈希表中指定的 field ,不存在忽略返回值,正常返回删除的 field 的数量。
    语法:hdel key fieldfield…

  • 常用命令
    hkeys:返回哈希中 key 的所有 field 域。
    语法:hkeys key
    hvals:返回哈希中 key 的所有 field 对应的 value 。
    语法:hvals key
    hexists:检测指定的 field 在当前哈希中是否存在。存在返回 1 ,不存在返回 0 。
    语法:hexists key field

2.5.3 列表(list)

  • 基本命令
    lpush:将一个或多个值 value 插入到列表 key 的表头(最左边),从左边开始加入值,从左到右的顺序依次插入到表头。
    语法:lpush key value value value…
    返回值:数字,新列表的长度。比如插入 a b c ,在列表中的顺序为 c b a rpush:将一个或多个值 value 插入到列表 key 的表尾(最右边),从右边开始加入值,从右到左的顺序依次插入到表尾。
    语法:rpush key value value value…
    返回值:数字,新列表的长度。比如插入 a b c ,在列表中的顺序为 a b c lrange:获取列表中指定区间内的元素。
    语法:lrange key start stop
    lindex:获取列表中指定下标的元素。超出下标返回 nil 。
    语法:lindex key index
    lien:获取列表 key 的长度。不存在返回 0 。
    语法: lien key

  • 常用命令
    lrem:根据 count 的值,移除列表中与 value 值相等的元素。count>0:从左开始删除 count 个,count<0:从右开始删除 -count 个,正负表示方向。如果是0,则表示全列表。
    语法:lrem key count value
    lset:将列表 key 下标为 index 的元素的值设置为 value。
    语法:lset key index value
    linsert:将值 value 插入到列表 key 当中位于值 pivot 之前或者之后的位置。key 不存在或者 pivot 不存在则不执行任何操作。pivot 相当于一个参考值。
    语法:linsert key BEFORE | ALFTER pivot value
    返回值:执行成功返回列表长度;key 不存在返回0;pivot 不存在返回 -1 。

2.5.4 集合类型(set)

  • 基本命令
    sadd:将一个或多个 member 元素加入到集合 key 中,已经存在于集合的 member 元素将会被忽略,无法再加入。
    返回值:新加入到集合的个数,不包括忽略的元素。
    语法:sadd key member member member…
    smembers:获取集合中的所有元素。不存在的 key 视为空集合。
    语法:smembers key
    sismember:判断 member 元素在该 key 中是否存在。存在返回 1 ,不存在返回 0 。
    语法:sismember key member
    scard:获取集合里面的元素个数。
    语法:scard key
    srem:删除集合 key 中一个或多个 member 元素,不存在的忽略 。返回成功删除的元素个数。
    语法:srem key member member member…

  • 常用命令
    srandmember:只提供 key ,随机返回集合中一个元素,元素不可删除,依旧在集合中;count 默认值为1,提供了 count 时,count 是正数,返回包含 count 个数元素集合,集合元素各不相同。count 是负数,返回一个 count绝对值的长度的集合,集合中元素可能会重复多次。
    返回值:一个元素;多个元素的集合。
    语法:srandmember key [count]
    spop:随机从集合中删除一个元素。count 是删除元素的个数。count 默认值为 1 。
    返回值:被删除的元素,key不存在返回 nil 。
    语法:spop key [count]

2.5.5 有序集合类型(zset)(sorted set)

  • 基本命令
    zadd:将一个或多个 member 元素及其 score(分数) 值加入到有序集合 key 中,如果 member 存在集合中,则更新值,score 可以是整数也可以是浮点数。如果 score 相同,则按照元素首字母顺序排列。返回值为新添加的元素的个数。语法:zadd key score member score member score member…
    zrange:查询有序集合,指定区间内的元素。WITHSCORES选项是让 score 和 value 一同返回。默认只返回 value。
    语法:zrange key start stop [WITHSCORES]
    zrevrange:查询有序集合,指定区间内的元素。WITHSCORES选项是让 score 和 value 一同返回。默认只返回value。其中成员的位置按 score 的倒叙来排序,其他等同于 zrange。语法:zrevrange key start stop [WITHSCORES]
    zrem:删除有序集合 key 中的一个或多个成员,不存在的成员被忽略返回值;返回被删除的成员数量。
    语法:zrem key member member member…
    zcard:获取有序集合 key 的元素成员的个数。key 不存在返回 0 。
    语法:zcard key

  • 常用命令

zrangebyscore:按照分数区间来查询有序集合中的成员,默认是大于等于和小于等于。使用符号(表示不包括。min,max 可以使用 -inf , +inf 表示最小和最大。limit 用于对查询结果分页。
语法:zrangebyscore key min max [WITHSCORES] [limit offset count]
zrevrangebyscore:按照分数区间来查询有序集合中的成员,查询结果按分数的倒叙排列,默认是大于等于和小于等于。使用符号(表示不包括。min,max 可以使用 -inf , +inf 表示最小和最大。limit 用于对查询结果分页。
语法:zrangebyscore key min max [WITHSCORES] [limit offset count]
zcount:返回有序集合 key 中,score 值在 min 和 max 之间的元素数量。默认是大于等于和小于等于。
语法:zcount key min max 返回值:查询出的集合数量

2.6 Redis 事务
首先,事务中没有回滚的概念。

2.6.1 什么是事务?
事务是指一系列操作步骤,这一系列的操作步骤,要么完全的执行,要么完全的不执行。Redis 中的事务(transaction)是一组命令的集合,至少是两个或两个以上的命令。Redis事务保证这些命令被执行时中间不会被任何其他操作打断。

2.6.2 事务操作的命令

  • multi:标记一个事务的开始。事务内的多条命令会按照先后顺序被放在一个队列中。
    返回值:OK
  • exec:执行所有事务块中的命令。
    返回值:事务内的所有执行语句内容,事务被打断(影响)返回 nil
  • discard:取消事务,放弃执行事务块中的所有命令。
    返回值:OK
  • watch:监视一个或多个 key ,如果在事务执行之前这个或这些 key 被其他命令修改,那么事务将会被打断。
    语法:watch key key key…
    返回值:OK
  • unwatch:取消所有监视,对应 watch。
    返回值:OK

2.6.3 事务的实现

  • 正常执行事务:首先开启事务,其次向事务队列中加入命令,最后执行事务提交。
    1.multi:开启事务。
    2.加入命令。
    3.exec:提交事务。

  • 事务执行 exec 之前,入队命令错误(语法错误;严重错误致服务器不能正常工作(例如内存不足)),放弃事务。

  • 事务执行 exec 之后,执行队列中的命令,命令执行时发生错误,事务提交。

  • 放弃事务:discard。表示主动放弃事务。

    2.6.4 Redis 的 watch 机制

    watch 机制原理:watch 机制:使用 watch 监视一个或多个 key ,跟踪 key 的 value 修改情况,如果有 key 的value 值在事务 exec 执行之前被修改了,整个事务被取消。exec 返回提示消息,表示事务已经失败了。watch 机制使得事务 exec 变的有条件,事务只有在被 watch 的 key 没有修改的前提下才能执行。不满足条件,事务被取消。使用 watch 监视了一个带过期时间的键,那么这个键过期了,事务仍然可以正常执行。大多数情况下,不同的客户端会访问不同的键,相互同时竞争同一个 key 的情况一般很少,乐观锁能够以很好的性能解决数据冲突问题。

2.7 Redis 持久化

2.7.1 持久化概述

持久化可以理解为存储,就是将数据存储到一个不会丢失的地方,如果把数据放在内存中,电脑关机或重启数据就会丢失,所以放在内存中的数据不是持久化的,而放在磁盘上算是一种持久化。
edis 的数据存储在内存中,内存是瞬时的,如果 linux 宕机或重启,又或者 redis 崩溃或重启,所有内存中的数据都会丢失,为了解决这个问题,redis 提供两种机制对数据进行持久化存储,便于发生故障后能迅速恢复数据。

2.7.2 持久化方式

  • RDB方式

Redis Database(RDB),就是在指定的时间间隔内将内存中的数据集快照写入磁盘,数据恢复时将快照文件直接再读到内存。
RDB 保存了再某个时间点的数据集(全部数据)。存储在一个二进制文件中,只有一个文件。默认是dump.rdb。RDB技术非常适合做备份,可以保存最近一个小时,一天,一个月的全部数据。保存数据实在一个单独的进程中写文件,不影响 Redis 的正常使用。 RDB 恢复数据时比其他 AOF 速度快。
有数据丢失的可能!!!

  • AOF方式

Append-only File(AOF),Redis 每次接受到一条改变数据的命令时,他将把该命令写到一个AOF文件中(只记录写操作,不记录读操作),当 Redis 重启时,它通过执行AOF 文件中所有的命令来恢复数据。 AOF方式默认时关闭的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
尚硅谷是一个教育机构,他们提供了一份关于Redis学习笔记。根据提供的引用内容,我们可以了解到他们提到了一些关于Redis配置和使用的内容。 首先,在引用中提到了通过执行命令"vi /redis-6.2.6/redis.conf"来编辑Redis配置文件。这个命令可以让你进入只读模式来查询"daemonize"配置项的位置。 在引用中提到了Redis会根据键计算出应该送往的插槽,并且如果不是该客户端对应服务器的插槽,Redis会报错并告知应该前往的Redis实例的地址和端口。 在引用中提到了通过修改Redis的配置文件来指定Redis的日志文件位置。可以使用命令"sudo vim /etc/redis.conf"来编辑Redis的配置文件,并且在文件中指定日志文件的位置。 通过这些引用内容,我们可以得出结论,尚硅谷的Redis学习笔记涵盖了关于Redis的配置和使用的内容,并提供了一些相关的命令和操作示例。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Redis学习笔记--尚硅谷](https://blog.csdn.net/HHCS231/article/details/123637379)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Redis学习笔记——尚硅谷](https://blog.csdn.net/qq_48092631/article/details/129662119)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值