Redis学习

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的值
取字符串aaa的值

Redis 配置

Redis的配置文件位于安装目录下,名为redis.conf.
可以使用CONFIG命令查看或设置配置项
CONFIG get * 查看所有配置信息
可以通过CONFIG set 配置项 值 启动后修改,
也可以通过修改配置文件修改配置信息
redis配置查看

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 keyttl 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为值
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英尺

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值