Redis相关知识点--->更新中
- 常用的五大数据类型
- Redis 键(key)
- Redis 字符串(String)
- String 的基本知识点
- String 的基本命令
- String 的数据结构
- Redis 列表(List)
- Redis 集合(Set)
- Redis 哈希(Hash)
- Redis 有序集合(Zset)
- Redis 的特性
- 原子性
- 例 1:
常用的五大数据类型
Redis 键(key)
keys *
查看当前库所有 key (匹配: keys *1)exists key
判断某个 key 是否存在type key
查看你的 key 是什么类型del key
删除指定的 key 数据unlink key
根据 value 选择非阻塞删除。
仅将 keys 从 keyspace 元数据中把内容删掉,真正的删除会在后续异步删除expire key 10
为给定的 key 设置制定过期时间ttl key
查看还有多少秒过期, -1 表示永不过期,-2 表示已过期select
命令切换数据库dbsize
查看当前数据库的 key 的数量flushdb
清空当前库
Redis 字符串(String)
String 的基本知识点
String 是 Redis 中最基本的数据类型,String
类型是二进制安全的,意味着 Redis 的 String 可以包含任何数据,比如 jpg 图片或者无序列化的对象。
String 类型是最多可以是 512M
String 的基本命令
set <key><value>
插入键值对get <key>
通过键查询对应的键值append <key> <value>
将给定的 value 追加到原值的末尾strlen <key>
获得值的长度setnx <key> <value>
只有在 key 不存在时设置 key 的值,如果有 key 返回 0incr <key>
将 key 中储存的数字值增加 1,只能对数字值操作,如果为空,新增值为 1decr <key>
将 key 中存储的数字值减少 1,只能对数字值操作,如果为空,新增值为-1incrby/decrby
<步长>` 将 key 中存储的数字值增减。自定义步长。mset <key1><value1><key2><value2>...
可同时设置一个或多个 key-value 键值对mget <key1><key2><key3>...
同时获取一个或多个 valuemsetnx <key1><value1><key2><value2>...
同时设置一个或多个 key-value 键值对,当且仅当所有给定 key 都不存在的时候进行。原子性,有一个失败则都失败。getrange <key><开始位置><结束位置>
获取值的范围,类似 java 中的 subString,前包(从 0 开始),后也包。setrange <key><开始位置><value>
用<value> 覆写<key>所储存的字符串值,从<开始位置>开始setex <key><过期时间><value>
设置键值的同时,设置过期时间,默认单位为秒。getset <key><value>
以新换旧,设置了新值同时获得旧值。
String 的数据结构
String 的数据结构为简单动态字符串(Simple Dynamic String,缩写 SDS)。是可以修改的字符串,内部结构实现上类似于 Java 的 ArrayList,采用预分配冗余空间的方式来减少内存的空间分配
如上图所示,内部空间为当前字符串实际分配的空间 capacity 一般要高于实际字符串长度 len。当字符串长度小于 1M 时,扩容都是加倍现有的空间,如果超过 1M 时,扩容时一次只会多扩容 1M 的空间。需要注意的是字符串最大长度为 512M。
Redis 列表(List)
Redis 集合(Set)
Redis 哈希(Hash)
Redis 有序集合(Zset)
Redis 的特性
原子性
此原子性与 mysql 的四大特性中的原子性不是同一个原子性。所谓原子操作是指不会被线程调度打断的操作,这种操作一旦开始就会一直运行到结束,中间不会有任何的 context switch(线程切换)
在单线程中,能给在单条指令中完成的操作都可以认为是原子操作,因为终端只能发生于指令之间。
在多线程中,不能被其他进程(线程)打断的操作就叫做院子操作。
Redis 单命令的原子性得益于 Redis 的单线程。
例 1:
java 中的 i++是否是原子操作?
有 2 个线程,分别对 i 进行++100 次,最后的值是多少?
========================================
答案:
2-200
解析:
线程创建和操作被打断操作是不确定的,++操作是分为 3 步进行的,第一步是取值,第二步是++ 第三步是赋值。
在 a 线程取值的同时 b 线程已经完成了取值并开始执行了++和赋值。这时候 a 线程的操作就被打断了.他需要重新获取值,再进行操作。如图: