Redis基本数据结构

1、String
1.1 数据结构
long len byte数组长度
long free 可用数组长度
char buff[] 数据内容
1.2 命令
键值:设置值通过字符串名
set:设置键值
setnx(set not exist):设置键值|若键不存在则可以存,否则返回0.
setex(set expire):设置键值(含过期时间),set key seconeds value
setrange:设置指定位置key的键值 例如setrange name diaodiao 2 haha-->dihahaao 从第二个位置开始替换
mset:设置多个键值
msetnx:设置多个不存在的键值
get:通过键获得值
getset:先通过键获得值,再设置值。
getrange(0~-1):获取指定范围的字符。范围|从左往右数从0开始 从右往左数-1开始。例如hello(0~4|-5~-1)
mget:获得多个键的值。 数字类型相关操作
set age 10(以下操作都是针对10操作)
incr 递增1 incr age-->11
incrby 递增指定数字-->incr age 5->16
decr 递减1
decrby 递减指定值 字符属性操作
set name "hello"
append:在尾部追加字符串 append name "Diaodiao"->helloDiaodiao
strlen: 获得字符串长度 strlen name ->5 2、hashes(存储键值对,类似于hashmap)
2.1 配置(redis.conf配置文件中)
默认:hash-max-zipmap-entries 配置字段最多64个(key的个数)
hash-max-zipmap-value 配置value最大为512字节
2.2 命令(参考String)
hset key field value
hset:若key不存在就创建,否则覆盖。
hsetnx:设置 hash field 为指定值,如果 key 不存在,则先创建。如果 field 已经存在,返回 0,nx 是not exist 的意思。
hmset:同时设置hash多个field
hget:获取指定的hash field
hmget:获取全部指定的hash field
hexists:测试指定field是否存在
hlen:返回指定的field的个数
hdel:删除指定field。
hkeys:查询指定key的所有field
hvals:获取指定key的所有value
hgetall:获得指定key的所有field以及值 3、lists
3.1 简介
list是基于双向链表的数据结构,操作就是入栈(push)、出栈(pop),包括左(头)入出栈、右(尾)入出栈,也含有超时阻塞的功能。
3.2 命令
lpush:在key对应的list的头部添加元素。
lrange:获得list范围的值。 lrange mylist start(0) stop(2)(获取0 1 2索引的值)
rpush:在key对应的list的尾部添加元素
linsert:在key对应的特定位置之前或者之后添加字符串元素 linsert mylist before “world” “hello”
lset:设置list指定下表的元素(从0开始)
lrem:从key对应的list里,删除count个value相同的元素。
ltrim:保留指定key的值范围内的数据。
lpop:从list的头部删除元素,并且返回删除元素
rpop:从list的尾部删除元素,并且返回删除元素
rpoplpush:第一个list的尾部移除元素并且添加到第二个list的头部
lindex:返回名称为key的list中index位置的元素
llen:返回key对应list的长度 4、sets
4.1 简介
sets是无序集合,是通过hashtable实现的。额外功能有并集、交集、差集。
4.2 命令
sadd:向名称为key的set当中添加元素
srem:删除名称为key的元素
spop:随机返回并且删除set中某key元素
sdiff:两个set的差集
sdiffstore:假设有set3、set1、set2-->set1与set2差集返回的元素,添加到set3中
sinter:两个set的交集
sinterstore:假设有set3、set1、set2-->set1与set2交集返回的元素,添加到set3中
sunion:两个set的并集
sunionstore:假设有set3、set1、set2-->set1与set2交集返回的元素,添加到set3中
smove:假设有set1、set2-->删除set1的某个key值,并且添加到set2
scard:返回set的元素个数
sismember:测试set中是否存在某member(元素)。
srandmember:随机返回一个元素,但是不删除 5、sorted set
5.1 简介
sorted set(skip list|双向链表和hashtable的结合体)是set的一个升级版本,升级版本的sets,有两个纬度,一个纬度用来存顺序,一个纬度用于存value。
5.2 命令
zadd:向名称为key的zset中添加元素member、score用于排序。如果该元素存在,则根据score更新该元素的顺序
zrem:删除名为key的zset的元素member
zincrby:如果在名称为 key 的 zset 中已经存在元素 member,则该元素的 score 增加 increment;否则向集合中添加该元素,其 score 的值为 increment
zrank:返回名称为 key 的 zset 中 member 元素的排名(按 score 从小到大排序)即下标
zrevrank:返回名称为 key 的 zset 中 member 元素的排名(按 score 从大到小排序)即下标
zrange:返回名称为 key 的 zset(按 score 从小到大排序)中的 index 从 start 到 end 的所有元素
zrevrange:返回名称为 key 的 zset(按 score 从大到小排序)中的 index 从 start 到 end 的所有元素
zrangebyscore:返回集合中 score 在给定区间的元素
zcount:返回集合中 score 在给定区间的数量
zcard:返回集合中元素个数
zscore:返回给定元素对应的 score
zremrangebyrank:删除集合中排名在给定区间的元素
zremrangebytscore:删除集合中 score 在给定区间的元素

Redis常用命令

  1、键值相关命令
keys *|key*|key???
exists key:确认一个 key 是否存在
del key:删除一个 key
expire key seconeds:设置一个 key 的过期时间(单位:秒)
move:将当前数据库中的 key 转移到其它数据库中。
persist:移除给定 key 的过期时间
ttl:查看过期还需要多长时间
randomkey:随机返回命名空间的一个key
renamekey:重命名key
type:返回值类型 2、元务器相关命令
ping:测试连接是否存活
echo:在命令行打印一些内容
select:选择数据库。Redis 数据库编号从 0~15,我们可以选择任意一个数据库来进行数据的存取。
quit:退出连接。
dbsize:返回当前数据库中 key 的数目。
info:获取服务器的信息和统计。
monitor:实时转储收到的请求。
config:获取服务器配置信息。
flushdb:删除当前选择数据库中的所有 key。
flushall:删除所有数据库中的所有 key。

Redis高级使用属性

1、安全性:设置每次命令之前都要确认密码|在redis.conf配置文件中修改 requirepass
2、主从复制
2.1 特点
(1)master可以拥有多个slave
(2)多个slave可以连接同一个master外,还可以连接其他slave
(3)主从复制不会阻塞master,同步数据,master可以继续处理client。
(4)提高系统的伸缩性
2.2、搭建过程
参考:http://www.cnblogs.com/qiuyong/p/6705689.html
3、事务控制
3.1 简单事务控制
multi-->事务begin
exec-->退出提交
3.2 事务回滚
muliti-->事务begin
discard-->事务回滚
4、持久化
4.1 snapshotting(默认)-快照方式
将数据以快照的方式写入到二进制文件中,也是dump.rpb。执行save、bgsave的时候会对dump.rpb
保存方式
save:手动存储、阻塞当前线程,把内存数据存到dump.rpb中。
bgsave:开启子线程、调用fork操作,后台将内存数据存到dump.rpb中。
redis.conf中默认设置为自动bgsave。
缺陷:
假设有client1、client2.
client1执行flushall、把内存数据全部清除。
client2执行的时候,因为之前数据在未知情况下被清除,这样就会造成很大的麻烦。
通常情况下,我们先把save之前,把相应dump.rpb转移到其他目录下进行保存,利于数据恢复。
4.2 aof(append-only file)-->如果应用要求不能丢失任何修改的话,可以采用 aof 持久化方式
机制:默认每隔一秒,redis会收到写命令,把内容追加到appendonnly.aof文件中。
配置redis.conf
appendonly yes //启用 aof 持久化方式
# appendfsync always //收到写命令就立即写入磁盘,最慢,但是保证完全的持久化
appendfsync everysec //每秒钟写入磁盘一次,在性能和持久化方面做了很好的折中
# appendfsync no //完全依赖 os,性能最好,持久化没保证
5、发布及订阅消息
5.1 订阅者 subscribe 通道(频道)例如tv1/tv2/tv3 psubscribe tv*例如tv开头的消息都能收到
5.2 发送者 publish tv1 message
5.3 退出订阅模式:unsubscribe、unpsubscribe
6、Pipeline 批量发送请求
1、普通方式
基于tcp的连接方式,每次都要等着回复才能执行
2、Pipeline方式
多个命令执行完以后,然后把执行结构返回给客户端。
7、虚拟内存相关配置
vm-enabled yes #开启 vm 功能
vm-swap-file /tmp/redis.swap #交换出来的 value 保存的文件路径
vm-max-memory 1000000 #redis 使用的最大内存上限
vm-page-size 32 #每个页面的大小 32 个字节
vm-pages 134217728 #最多使用多少页面
vm-max-threads 4 #用于执行 value 对象换入换出的工作线程数量

Redis 持久化磁盘 IO 方式及其带来的问题

  有 Redis 线上运维经验的人会发现 Redis 在物理内存使用比较多,但还没有超过实际物理内存总容量时就会发生不稳定甚至崩溃的问题,有人认为是基于快照方式持久化的 fork 系统调用造成内存占用加倍而导致的,这种观点是不准确的,因为 fork 调用的 copy-on-write 机制是基于操作系统页这个单位的,也就是只有有写入的脏页会被复制,但是一般你的系统不会在短时间内所有的页都发生了写入而导致复制,那么是什么原因导致 Redis 崩溃的呢?
 
  答案是 Redis 的持久化使用了 Buffer IO 造成的,所谓 Buffer IO 是指 Redis 对持久化文件的写入和读取操作都会使用物理内存的 Page Cache,而大多数数据库系统会使用 Direct IO 来绕过这层 Page Cache 并自行维护一个数据的 Cache,而当 Redis 的持久化文件过大(尤其是快照文件),并对其进行读写时,磁盘文件中的数据都会被加载到物理内 存中作为操作系统对该文件的一层 Cache,而这层 Cache 的数据与 Redis 内存中管理的数据实际是重复存储的,虽然内核在物理内存紧张时会做 Page Cache 的剔除工作,但内核很可能认为某块 Page Cache 更重要,而让你的进程开始 Swap,这时你的系统就会开始出现不稳定或者崩溃了。我们的经验是当你的 Redis 物理内存使用超过内存总容量的3/5时就会开始比较危险了。
  
  总结:
  1. 根据业务需要选择合适的数据类型,并为不同的应用场景设置相应的紧凑存储参数。
  2. 当业务场景不需要数据持久化时,关闭所有的持久化方式可以获得最佳的性能以及最大的内存使用量。
  3. 如果需要使用持久化,根据是否可以容忍重启丢失部分数据在快照方式与语句追加方式之间选择其一,不要使用虚拟内存以及 diskstore 方式。
  4. 不要让你的 Redis 所在机器物理内存使用超过实际内存总量的3/5。

Redis思维导图的更多相关文章

  1. redis基础知识思维导图

    看到一张redis的基础知识思维导图,比较清晰, 但是没有标明来源,希望知道的给个地址,我也好说明来源 图大小有1M多.在博客上看比较模糊,可以先下载下来查看,或者在浏览器新标签中打开图片查看,就比较 ...

  2. 面试还搞不懂redis,快看看这40道面试题(含答案和思维导图)

    Redis 面试题 1.什么是 Redis?. 2.Redis 的数据类型? 3.使用 Redis 有哪些好处? 4.Redis 相比 Memcached 有哪些优势? 5.Memcache 与 Re ...

  3. 【转】面试还搞不懂redis,快看看这40道Redis面试题(含答案和思维导图)

    ———————————————— 版权声明:本文为CSDN博主「程序员追风」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog. ...

  4. 浅谈Java的主要学习要点_上海尚学堂java培训课程思维导图

    Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言.Java 技术具有卓越的通用性.高效性.平台移植性和安全性,广泛应用于PC.数据中心.游戏控制台.科学超级计算机.移动电话和互联网,同时拥 ...

  5. 18道kafka高频面试题哪些你还不会?(含答案和思维导图)

    前言 Kafka是最初由Linkedin公司开发,是一个分布式.支持分区的(partition).多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处 ...

  6. 精心整理「服务器Linux C/C++」 成长路程(附思维导图)

    前言 我不是名校毕业,更没有大厂的背景,我只是一个毕业不到 2 年的普普通通的程序员,在摸爬滚打的工作这段时间里,深知了有一个「完整的知识体系」是非常重要的.当事人非常后悔没有在大学期间知道这个道理- ...

  7. SpringBoot图文教程「概念+案例 思维导图」「基础篇上」

    有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 每个知识点配套自测面试题,学完技术自我测试 本文初学向,所以希望文中所有的代码案例都能敲一遍 大哥大姐 ...

  8. RabbitMQ面试题集锦(精选)(另附思维导图)

    1.使用RabbitMQ有什么好处? 1.解耦,系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦! 2.异步,将消息写入消息队列,非必要的业务逻辑以异步的 ...

  9. .NET 技术栈 思维导图

    背景介绍 根据网上招聘网站的一些.NET技能需求,画了一个图,便于在自修和学习的过程当中有一个方向. 技能栈 Web front-end o 框架技术 ▣ Vue ▣ Bootstrap ▣ LayU ...

随机推荐

  1. Iterable与Collection源码学习

    接口 - Iterable<T> - 可迭代 描述 实现本接口的类,其对象可以被迭代.同时支持forEach语法 方法 Iterator<T> iterator() 类型 抽象 ...

  2. [转]UiPath Keyboard Shortcuts

    本文转自:https://docs.uipath.com/studio/docs/keyboard-shortcuts The complete list of keyboard shortcuts ...

  3. 设置UICollectionViewCell圆角和阴影

    设置cell圆角: cell.contentView.layer.cornerRadius =2.0f; cell.contentView.layer.borderWidth =1.0f; cell. ...

  4. [20191220]关于共享内存段相关问题.txt

    [20191220]关于共享内存段相关问题.txt --//我一直很好奇如果设置内核参数kernel.shmmax = 68719476736足够大,为什么我的测试实例还是建立3个共享内存段.--// ...

  5. Linux命令详解 三

    Linux用户和组的属性与权限本章结构1.用户账号和组账号概述2.用户账号和组账号管理3.查询账号信息4.查看目录或文件的属性5.设置目录或文件的权限6.设置目录或文件的归属 前言在linux中一切都 ...

  6. 华为hcnp r&s考试一共有三门,R&S-IERS,R&S-IENP,R&S-IEEP

    大纲1.HCNP-R&S-IEEP V2.0考试大纲 考试内容:HCNP-R&S-IEEP考试覆盖对企业网络的规划.设计.实施.维护.排障.优化以及网络割接等. 知识点: 网络规划:1 ...

  7. mysql5.7中timestam默认值'0000-00-00 00:00:00'报错

    在mysql5.7中设置 timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'会报错: 解决办法: mysql> set sql_mode='NO_A ...

  8. 洛谷 UVA1328 Period

    洛谷 UVA1328 Period 洛谷传送门 题目描述 PDF 输入格式 无 输出格式 无 题意翻译 题意描述 对于给定字符串S的每个前缀,我们想知道它是否为周期串.也就还是说,它是否为某一字符串重 ...

  9. Laravel 即时应用的一种实现方式

    即时交互的应用 在现代的 Web 应用中很多场景都需要运用到即时通讯,比如说最常见的支付回调,与三方登录.这些业务场景都基本需要遵循以下流程: 客户端触发相关业务,并产生第三方应用的操作(比如支付) ...

  10. 当面试官要你介绍一下MQ时,该怎么回答?

    一.为什么要使用MQ消息中间件? 一个用消息队列的人,不知道为啥用,有点尴尬.没有复习这点,很容易被问蒙,然后就开始胡扯了. 回答:这个问题,咱只答三个最主要的应用场景,不可否认还有其他的,但是只答三 ...