Redis简介
Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
Redis优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis与其他key-value存储有什么不同?
-
Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
-
Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
启动Redis
在redis文件目录下使用启用命令窗口(cmd)输入命令
redis-server.exe redis.windows.conf
执行之后redis已经启动,然后再开启一个命令窗口(cmd)输入命令
redis-cli.exe -h 127.0.0.1 -p 6379
存入一个字符串set aaa bbb
取字符串aaa的值
Redis 配置
Redis的配置文件位于安装目录下,名为redis.conf.
可以使用CONFIG命令查看或设置配置项
CONFIG get * 查看所有配置信息
可以通过CONFIG set 配置项 值 启动后修改,
也可以通过修改配置文件修改配置信息
Redis数据类型
Redis支持五种数据类型:
- string(字符串),
- hash(哈希),
- list(列表),.
- set(集合),
- zset(sorted set:有序集合)。
Key操作
redis为key-value数据库,所有值以key-value形式存储
删除key 不存在该key会被忽略
删除string类型的时间复杂度O(N)
list set zset hash类型是时间复杂度为O(M),M为key中元素个数
返回值为删除key的个数
del key [key...]
查找所有符合模式的key
keys pattern
*代表一个或多个任意字符
?代表一个任意字符
[ab]为a字符或b字符
特殊符号使用\隔开
时间复杂度O(N)
127.0.0.1:6379> set name yaku
OK
127.0.0.1:6379> keys na*
1) "name"
127.0.0.1:6379> keys na?e
1) "name"
kseys *
为查找所有key
随机获取一个key
127.0.0.1:6379> set hello word
OK
127.0.0.1:6379> RANDOMKEY
"hello"
127.0.0.1:6379> keys *
1) "name"
2) "hello"
获取当前key剩余存活时间
ttl key
当key不存在时,返回-2
没有给key设置过期时间,返回-1
以秒为单位返回存活时间
#不存在的 key
redis> FLUSHDB
OK
redis> TTL key
(integer) -2
# key 存在,但没有设置剩余生存时间
redis> SET key value
OK
redis> TTL key
(integer) -1
# 有剩余生存时间的 key
redis> EXPIRE key 10086
(integer) 1
redis> TTL key
(integer) 10084
pttl key
与ttl key
类似,ttl命令返回以秒为单位,pttl命令返回以毫秒为单位
是否存在key
exists key
当前数据库是否存在该key
存在返回1,否则返回0
移动当前key到指定数据库
redis默认使用第一个数据库,内置一共有16个数据库
move key db
如果当前数据库和目标数据库都存在该key,或者当前数据库不存在该key,没有任何效果
key重命名
rename key newkey
当前key改名为newkey
成功返回ok,失败返回错误
当newkey不存在时,重命名
renamenx key newkey
当且仅当newkey不存在时,将key改名为newkey
当key不存在返回错误
修改成功时,返回 1
如果 newkey 已经存在,返回 0
获取值得类型
type key
返回值
none (key 不存在)
string (字符串)
list (列表)
set (集合)
zset (有序集)
hash (哈希表)
设置key的存活时间
为制定key设置存活时间,当key过期,会被自动删除
在key的存活时间内,对key进行修改操作不会更改key的存活时间,即使修改key的名字也不会更改存活时间。
使用 persist
命令可以在不删除 key 的情况下,移除 key 的生存时间,让 key 重新成为一个『持久化』(persistent) key 。
再次使用expire
命令可以取代之前的存活时间
expire key second
取消存活时间
可以理解为一个持久化的操作,如果当前key被设置了存活时间,persist key
可以取消当前key的存活时间
redis> SET mykey "Hello"
OK
redis> EXPIRE mykey 10 # 为 key 设置生存时间
(integer) 1
redis> TTL mykey
(integer) 10
redis> PERSIST mykey # 移除 key 的生存时间
(integer) 1
redis> TTL mykey
(integer) -1
序列化key
序列化给定 key ,并返回被序列化的值,使用 RESTORE 命令可以将这个值反序列化为
Redis 键。
序列化生成的值有以下几个特点:
- 它带有 64 位的校验和,用于检测错误, RESTORE 在进行反序列化之前会先检查
校验和。 - 值的编码格式和 RDB 文件保持一致。
- RDB 版本会被编码在序列化值当中,如果因为 Redis 的版本不同造成 RDB 格式不
兼容,那么 Redis 会拒绝对这个值进行反序列化操作。
序列化的值不包括任何生存时间信息。
时间复杂度:
查找给定键的复杂度为 O(1) ,对键进行序列化的复杂度为 O(N*M) ,其中 N 是构成
key 的 Redis 对象的数量,而 M 则是这些对象的平均大小。
如果序列化的对象是比较小的字符串,那么复杂度为 O(1) 。
返回值:
如果 key 不存在,那么返回 nil 。
否则,返回序列化之后的值。
redis> SET greeting "hello, dumping world!"
OK
redis> DUMP greeting
"\x00\x15hello, dumping world!\x06\x00E\xa0Z\x82\xd8r\xc1\xde"
redis> DUMP not-exists-key
(nil)
String类型
string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
Hash(哈希)
Redis hash 是一个键值(key=>value)对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
map为hash结构的名字,field和bb为键,aa和cc为值
实例中我们使用了 Redis HMSET, HGET 命令,HMSET 设置了两个 field=>value 对, HGET 获取对应 field 对应的 value。
每个 hash 可以存储 232 -1 键值对(40多亿)。
List(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
使用lpush存入一个list结构数据,list为列表名,123为存入的值,如图为顺序存入,取值时需要指定起点和终点。
列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。
Set集合
Redis 的 Set 是 string 类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
sadd 命令
添加一个 string 元素到 key 对应的 set 集合中,成功返回 1,如果元素已经在集合中返回 0。
sadd key value
使用smembers 键名
集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。
zset(sorted set:有序集合)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
zadd 命令
添加元素到集合,元素在集合中存在则更新对应score
zadd key score member
bitmap(位图)
通过一个bit来存储数据,也就是说只能存储0和1,常用语用作签到,统计用户活跃情况使用
比如说使用bitmap统计每天的打卡情况,需要365个bit就可以实现,可以说是内存消耗的特别小
bitmap对内存大小的开销可以通过偏移量计算出来$offset/8/1024/1024)MB
偏移量打一个也就需要多1bit的内存空间
存储key的偏移量值为1或0
setbit key offset value(1 or 0)
取key的偏移量的值
getbit key offset
统计key中二进制为的个数
bitcount key [start end]
合并两个bitmap以位运算为运算符
bitop operation destkey key [key …]
HyperLogLog(基数统计)
用来做基数统计使用,比如说一个有重复元素的集合,需要统计集合中不重复的元素个数。比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。
PFADD key element [element ...]
添加制定元素到HyperLogLog类型的key中
PFCOUNT key [key ...]
统计HyperLogLog类型key中的元素个数
PFMERGE destkey sourcekey [sourcekey ...]
合并多个HyperLogLog类型的key
GEO(地理位置)
主要用来存储地理位置信息,并对存储对象进行操作。
GEOADD key longitude latitude member [longitude latitude member ...]
添加一个或多个经度(longitude ),纬度(latitude ),位置名称为(member)的对象都key中
GEOPOS key member [member ...]
获取key中对象的地理位置信息,如果该对象不存在则返回nil
GEODIST key member1 member2 [m|km|ft|mi]
计算两地之间距离,m米,km千米,mi英里,ft英尺