Redis基础知识详解

目录

一、Redis概述。

二、Redis数据类型key键。

1.keys。

2.exists。

3.type。

4.del。

5.expire。

6.ttl。

7.persist。

三、Redis数据类型String。

1.set。

2.get。

3.append。

 4.strlen。

5.setex。

6.setnx。

7.getrange。

 8.setrange。

 9.incr。

10.decr。

11.incrby/decrby key step。 

11.mset。

12.mget。

13.getset。 

四、Redis数据类型List。

1.lpush/rpush。

2.lrange。

3.lpop/rpop。

4.lindex。

5.llen。

6. lrem。

7.linsert。

五、Redis数据类型Set。

1.sadd。

2.smembers。

3.sismember。

4.scard。

5.srem。

6.spop。

7.srandmember。

8.smove。

六、Redis数据类型Hash。

1.hset。 

2.hget 。

3.hmset。

4.hexists。

5.hkeys。 

6.hvals。

7.hincrby。

8.hdel。 

9.hsetnx。

七、Redis数据类型Zset 。

1.zadd。

2.zrange。 

3.zrangebyscore。 

4.zincrby。

5.zrem。

6.zcount。

7.zrank。

八、Redis数据类型_Bitmaps。

1.setbit。

2.getbit。

3.bitcount。

4.bitop。

九、Redis数据类型Geospatia。

1.geoadd。

2.geopos。

 3.geodist。

4.georadius。

十、Redis数据类型Hyperloglog。

1.pfadd。

2.pfcount。 

3.pfmerge。


一、Redis概述。

Redis是一个字典结构的存储服务器,一个Redis实例提供了多个用来存储数据的字典,客户端可以指定将数据存储在哪个字典中。

这与在一个关系数据库实例中可以创建多个数据库类似(如下图所示),所以可以将其中的每个字典都理解成一个独立的数据库。

Redis基础知识详解_第1张图片

 Redis默认支持16个数据库,可以通过调整Redis的配置文件redis/redis.conf中的databases来修改这一个值,设置完毕后重启Redis便完成配置。

因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。

redis 采用网络IO多路复用技术来保证在多连接的时候, 系统的高吞吐量。

二、Redis数据类型key键。

1.keys。

查看当前库中所有的key 。

语法结构:

keys *        

有3个通配符 *, ? ,[]

  • *: 通配任意多个字符
  • ?: 通配单个字符
  • []: 通配括号内的某1个字符

2.exists。

判断某个key是否存在,返回1表示存在,0不存在。

语法结构:

exists key     

例如:

#查看k1是否存在,如果存在返回1

exists k1

# 查看k1 k2 k3是否存在,如果k1 k2存在,k3不存在,则返回2

exists k1 k2 k3

注意:可以设置多个key,只返回存在的个数,但不返回哪一个存在/不存在。

3.type。

查看当前key 所储存的值的类型。返回当前key所储存的值的类型,如string 、list等。

语法结构:

type key    

例如:

#查看k1的类型

type k1

4.del。

删除已存在的key,不存在的 key 会被忽略。

语法结构:

del key     

例如:

可以设置多个key,返回删除成功的个数。

# 删除k1,如果成功返回1,失败返回0

del k1

# 删除k1 k2 k3,如果k1 k2存在,k3不存在,则返回2

del k1 k2 k3

5.expire。

给key设置time秒的过期时间。设置成功返回 1 。 当 key 不存在返回 0。

语法结构:

expire key time     

例如:

# 给k1设置10秒后过期

expire k1 10

6.ttl。

以秒为单位返回 key 的剩余过期时间。

语法结构:

ttl key    

例如:

# 查看k1剩余过期时间

ttl k1

注意:当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单位,返回 key 的剩余生存时间。

7.persist。

移除给定 key 的过期时间,使得 key 永不过期。

语法结构:

persist key     

例如:

# 移除k1的过期时间,使得 k1 永不过期。

persist k1

注意:当过期时间移除成功时,返回 1 。 如果 key 不存在或 key 没有设置过期时间,返回 0 。

三、Redis数据类型String。

String是Redis最基本的类型,一个key对应一个value。String是二进制安全的,意味着String可以包含任何数据,比如序列化对象或者一张图片。String最多可以放512M的数据。

使用场景:

  • 计数器
  • 统计多单位的数量
  • 粉丝数
  • 对象缓存存储
  • 分布式锁

常用命令:

1.set。

用于设置给定 key 的值。如果 key 已经存储其他值, set 就重写旧值,且无视类型。

语法格式:

set key value    

例如:

set k1 v1

2.get。

用于获取指定 key 的值。如果 key 不存在,返回 nil。

语法格式:

get key   

例如:

get k1

3.append。

将给定的value追加到key原值末尾。

语法格式:

append key value  

#k1后拼接字符串a

APPEND k1 "a"

注意:

  • 如果 key 已经存在并且是一个字符串, append 命令将 value 追加到 key 原来的值的末尾。
  • 如果 key 不存在, append 就简单地将给定 key 设为 value ,就像执行 set key value 一样。

 4.strlen。

获取指定 key 所储存的字符串值的长度。当 key 储存的不是字符串值时,返回一个错误。

语法格式:

strlen key    

例如:

#查看k1的长度

strlen k1 

5.setex。

给指定的 key 设置值及time 秒的过期时间。如果 key 已经存在, setex命令将会替换旧的值,并设置过期时间。

语法格式:

setex key time value  

例如:

#向Redis中设置一个k1的键值对并且10秒后过期

setex k1 10 v1

6.setnx。

只有在key不存在时设置key的值

语法格式:

setnx key value    

例如:

setnx k1 v1

7.getrange。

获取指定区间范围内的值,类似between........and 的关系

语法格式:

getrange key start end    

例如:

#获取k5字符串2-4位的字符串

getrange k5 2 4

 8.setrange。

设置指定区间范围内的值,并替换

语法格式:

setrange key offset value   

例如:

#从下标1开始设置xxx值,将原有的替换掉

setrange k6 1 xxx

 9.incr。

将 key 中储存的数字值增一。

语法格式: 

incr key   

例如:

#因为Redis中不存在k1,所以先初始化为0,再递增,值为1 

incr k1

incr k1 存在k1,递增后k1的值为2

incr k1

注意:

  • 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 incr 操作。
  • 如字符串类型的值不能表示为数字、或者是其他类型,那么返回一个错误。

10.decr。

将 key 中储存的数字值减一。

语法格式:

decr key  

例如:

decr k1 

注意:

  • 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 decr 操作。
  • 如字符串类型的值不能表示为数字、或者是其他类型,那么返回一个错误。

11.incrby/decrby key step。 

将key存储的数字值按照step进行增减。

例如:

#k1加10

incrby k1 10

#k1减10

decrby k1 10

注意:

  • 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 incrby/decrby 命令。
  • 如字符串类型的值不能表示为数字、或者是其他类型,那么返回一个错误。

12.mset。

同时设置一个或多个 key-value 。

语法格式:

mset key1 value1 key2 value2  

例如:

mset k1 v1 k2 v2 k3 v3 

13.mget。

返回所有(一个或多个)给定 key 的值。

例如:

mget k1 k2 k3

注意:

如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。

14.getset。 

将给定key值设为value,并返回key的旧值(old value),简单一句话(先get然后立即set)。

例如:

#获取k1的旧值并用wcc替换旧值

getset k1 wcc

四、Redis数据类型List。

List是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。底层是一个双向链表,对两段操作性能极高,通过索引操作中间的节点性能较差。

一个List最多可以包含 $2^{32}-1$个元素 ( 每个列表超过40亿个元素)。

使用场景:

  • 消息队列
  • 排行榜
  • 最新列表

常用命令:

1.lpush/rpush。

从左边(头部)/右边(尾部)插入一个或多个值。

语法格式:

lpush/rpush key1 value1 value2 value3……

例如:

#从左边放入v1 v2 v3

lpush k1 v1 v2 v3

#从右边放入v4 v5 v6

rpush k1 v4 v5 v6

2.lrange。

返回key列表中的start和end之间的元素(包含start和end)。 其中 0 表示列表的第一个元素,-1表示最后一个元素。

语法格式:

lrange key start end  

例如:

#取出列表里前3个值

lrange k1 0 2

#取出列表里全部值

lrange k1 0 -1

3.lpop/rpop。

移除并返回第一个值或最后一个值。

语法格式:

lpop/rpop key   

例如:

lpop k1 

rpop k1 

注意:值在键在,值光键亡。

4.lindex。

获取列表index位置的值(从左开始)。

例如:

lindex k1 0

5.llen。

获取列表长度。

例如:

llen k1

6. lrem。

从左边开始删除与value相同的count个元素。

例如:

#从左边开始删除k1列表中2个v1元素

lrem k1 2 v1

7.linsert。

在列表中value值的前边/后边插入一个new value值(从左开始)。

例如:

#

在v1前面插入一个v5

linsert k1 before v1 v5

8.lset。

将索引为index的值设置为value

例如:

#将索引为0的值设置为a

lset k1 0 a

五、Redis数据类型Set。

与List类似是一个列表功能,但Set是自动排重的,当需要存储一个列表数据,又不希望出现重复数据时,Set是一个很好的选择。

Set是String类型的无序集合,它底层其实是一个value为null的hash表,所以添加、删除、查找的时间复杂度都是O(1)。

使用场景:

  • 黑白名单
  • 随机展示
  • 好友
  • 关注人
  • 粉丝
  • 感兴趣的人集合

常用命令:

1.sadd。

将一个或多个元素添加到集合key中,已经存在的元素将被忽略。

例如:

#向集合中添加值,最终只有v1 v2 v3 v4 v5 v6

sadd k1 v1 v2 v2 v3 v4 v5 v6

2.smembers。

取出该集合的所有元素。

例如:

#取出k1集合中的所有元素。

smembers k1

3.sismember。

判断集合key中是否含有value元素,如有返回1,否则返回0。

例如:

#判断集合k1中是否含有v1元素。

sismember k1 v1

4.scard。

返回该集合的元素个数。

例如:

#返回k1集合的元素个数。

scard k1

5.srem。

删除集合中的一个或多个成员元素,不存在的成员元素会被忽略。

例如:

## 删除v1 v2

srem k1 v1 v2

6.spop。

随机删除集合中一个元素并返回该元素。

例如:

#随机删除k1集合中的一个元素,并返回。

spop k1

7.srandmember。

随机取出集合中count个元素,但不会删除。

例如:

#随机取出集合中的2个元素

srandmember k1 2

8.smove。

将value元素从sourcekey集合移动到destinationkey集合中。

例如:

#将元素v5从集合k1中移动到集合k2

smove k1 k2 v5

注意

如果 sourcekey集合不存在或不包含指定的 value元素,则 smove 命令不执行任何操作,仅返回 0 。

9.sinter/sunion/sdiff。

返回两个集合的交集/并集/差集元素。

例如:

#返回k1,k2集合的交集

sinter k1 k2 

#返回k1,k2集合的并集

sunion k1 k2

#返回k1,k2集合的差集(k1中的,不包含k2)

sdiff k1 k2

六、Redis数据类型Hash。

Hash是一个键值对的集合。Hash 是一个 String 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。

  • Hash存储结构优化

    • 如果field数量较少,存储结构优化为类数组结构
    • 如果field数量较多,存储结构使用HashMap结构

使用场景:

  • 购物车
  • 存储对象

常用命令:

1.hset。 

给key集合中的field赋值value。

例如:

语法格式:

hset key field value    

#给user集合中的name赋值test

hset user name test

注意:

  • 如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。
  • 如果字段已经存在于哈希表中,旧值将被重写。

2.hget 。

从key哈希中,取出field字段的值。

语法格式:

hget key field   

例如:

#获取user集合中name的值

hget user name

3.hmset。

批量设置哈希的字段及值。

语法格式:

hmset key field1 value1 field2 value2……  

例如:

hmset user name 张三 age 15 

4.hexists。

判断指定key中是否存在field

语法格式:

hexists key field  

例如:

hexists user name 

注意:

如果哈希表含有给定字段,返回 1 。 如果哈希表不含有给定字段,或 key 不存在,返回 0 。

5.hkeys。 

获取该哈希中所有的field。

例如:

hkeys user

6.hvals。

获取该哈希中所有的value。

hvals user

7.hincrby。

为哈希表key中的field字段的值加上增量increment。

语法格式:

hincrby key field increment  

例如:

hincrby user age 10 

注意:

  • 增量也可以为负数,相当于对指定字段进行减法操作。
  • 如果哈希表的 key 不存在,一个新的哈希表被创建并执行 hincrby 命令。
  • 如果指定的字段不存在,那么在执行命令前,字段的值被初始化为 0 。
  • 对一个储存字符串值的字段执行 hincrby 命令将造成一个错误。

8.hdel。 

删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略。

例如:

hdel user age

9.hsetnx。

给key哈希表中不存在的的字段赋值 。

例如:

hsetnx user age 10

注意:

  • 如果哈希表不存在,一个新的哈希表被创建并进行 hsetnx 操作。
  • 如果字段已经存在于哈希表中,操作无效。
  • 如果 key 不存在,一个新哈希表被创建并执行 hsetnx 命令。

七、Redis数据类型Zset 。

Zset与Set非常相似,是一个没有重复元素的String集合。不同之处是Zset的每个元素都关联了一个分数(score),这个分数被用来按照从低分到高分的方式排序集合中的元素。集合的元素是唯一的,但分数可以重复。

注意:因为元素是有序的,所以可以根据分数(score)或者次序(position)来获取一个范围内的元素。

使用场景:

  • 延时队列
  • 排行榜
  • 限流

常用命令:

1.zadd。

将一个或多个元素(value)及分数(score)加入到有序集key中。

语法格式:

zadd key score1 value1 score2 value2……  

例如:

zadd k1 100 java 200 c++ 300 python 400 php 

注意:

  • 如果某个元素已经是有序集的元素,那么更新这个元素的分数值,并通过重新插入这个元素,来保证该元素在正确的位置上。
  • 分数值可以是整数值或双精度浮点数。
  • 如果有序集合 key 不存在,则创建一个空的有序集并执行 zadd 操作。

2.zrange。 

返回key集合中的索引start和索引end之间的元素(包含start和end)。

语法格式:

zrange key start end [withscores]   

例如:

#返回集合中所有元素 

zrange k1 0 -1

# 返回集合中所有元素,并携带元素分数

zrange k1 0 -1 withscores

注意:

  • 其中元素的位置按分数值递增(从小到大)来排序。 其中 0 表示列表的第一个元素,-1表示最后一个元素。
  • withscores是可选参数,是否返回分数。

3.zrangebyscore。 

返回key集合中的分数minscore 和分数maxscore 之间的元素(包含minscore 和maxscore )。其中元素的位置按分数值递增(从小到大)来排序。

语法格式 :

zrangebyscore key minscore maxscore [withscores]   

例如:

#返回200-400分之间的元素递增排序 

zrangebyscore k1 200 400

4.zincrby。

为元素value的score加上increment的值。

例如:

#给java元素加上50分

zincrby k1 50 java

5.zrem。

删除该集合下value的元素。

例如:

#删除php
zrem k1 php

6.zcount。

统计该集合在minscore 到maxscore分数区间中元素的个数。

例如:

#

统计100分到300分中间元素的个数

zcount k1 100 300

7.zrank。

返回value在集合中的排名,从0开始。 

例如:

#返回c++排名

zrank k1 c++

八、Redis数据类型_Bitmaps。

在计算机中,用二进制(位)作为存储信息的基本单位,1个字节等于8位。

例如 "abc" 字符串是由 3 个字节组成,计算机存储时使用其二进制表示,"abc"分别对应的ASCII码是97、98、99,对应的二进制是01100001、01100010、01100011,在内存中表示如下:

Redis基础知识详解_第2张图片

合理地使用位能够有效地提高内存使用率和开发效率。

Redis提供了Bitmaps这个 “数据结构” 可以实现对位的操作:

Redis基础知识详解_第3张图片

使用场景:

  • 活跃天数
  • 打卡天数
  • 登录天数
  • 用户签到
  • 统计活跃用户
  • 统计用户是否在线
  • 实现布隆过滤器

 常用命令:

1.setbit。

设置Bitmaps中某个偏移量的值。

语法格式:

例如:

setbit key offset value   

redis中bitmaps可以用来统计用户信息,eg:活跃天数、打卡天数、登录天数

bitmaps位图,都是操作二进制来进行记录,就只有0和1两个状态

getbit sign 1 # 获取第一天的打卡状态

etbit zhangsan:3 1 1 # 往sign中添加数据,第1天打卡

setbit zhangsan:3 2 0 # 第2天未打卡

setbit zhangsan:3 3 1 # 第3天打卡

BITCOUNT sign # 统计所有打卡天数

getbit sign 1 # 获取第一天的打卡状态

2.getbit。

获取Bitmaps中某个偏移量的值。

# 获取偏移量为1的值,结果为1

getbit sign 1

#获取偏移量为99的值(如果偏移量未设置值,则也返回0。),结果为0

getbit sign 99

3.bitcount。

统计字符串被设置为1的bit数量。一般情况下,给定的整个字符串都会被进行统计,可以选择通过额外的start和end参数,指定字节组范围内进行统计(包括start和end),0表示第一个元素,-1表示最后一个元素。

语法格式:

bitcount key [start end]   

例如: 

前提条件:当前存在一个key为k1的bitmaps存储着[00000001,00000001,00000010,00000011],分别对应[1,1,2,3]。

bitcount num 1 2 统计索引1、2两个字节组中bit=1的数量,即统计00000001,00000010中bit=1的数量,结果为2

bitcount num 1 3 统计索引1、2、3三个字节组中bit=1的数量,即统计00000001,00000010,00000011中bit=1的数量,结果为4

bitcount num 0 -1 统计所有的字节组中bit=1的数量,结果为5

setbit设置或获取的是bit(位)的位置,bitcount计算的是byte(字节)位置。

4.bitop。

将多个bitmaps通过求交集/并集方式合并成一个新的bitmaps。

语法格式:

bitop and/or destkey sourcekey1 sourcekey2……  

例如:

#通过求交集将k1 k2合并成k3

bitop and k3 k1 k2

#通过求并集将k1 k2合并成k3

bitop or k3 k1 k2

九、Redis数据类型Geospatia。

GEO,Geographic,地理信息的缩写。该类型就是元素的二维坐标,在地图上就是经纬度。Redis基于该类型,提供了经纬度设置、查询、范围查询、距离查询、经纬度Hash等常见操作。

使用场景:

  • 附近的电影院

  • 附近的好友

  • 离最近的火锅店

常用命令:

1.geoadd。

用于存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中。

语法格式:

geoadd key longitude latitude member   

# 将北京的经纬度和名称添加到china

geoadd china 116.405285 39.904989 beijing

# 将成都和上海的经纬度、名称添加到china

geoadd china 104.065735 30.659462 chengdu 121.472644 31.231706 shanghai

2.geopos。

从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回 nil。

例如:

#返回china中名称为shanghai和beijing的经纬度

geopos china shanghai beijing

 3.geodist。

用于返回两个给定位置之间的距离。

例如:

# 返回shanghai和beijing之间的距离,结果1067597.9668,单位米

geodist china shanghai beijing

# 返回shanghai和chengdu之间的距离,结果1660.0198,单位是千米

geodist china shanghai chengdu km

4.georadius。

以给定的经纬度(longitude latitude)为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离(radius )的所有位置元素。

例如:

#获取经纬度110 30为中心,在china内1200公里范围内的所有元素。

georadius china 110 30 1200 km

十、Redis数据类型Hyperloglog。

在我们做站点流量统计的时候一般会统计页面UV(独立访客:unique visitor)和PV(即页面浏览量:page view)。redis HyperLogLog是用来做基数统计的算法,HyperLogLog的优点是:在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且使很小的。

基数:比如数据集{1,3,5,7,5,7,8},那么这个数据集的基数集为{1,3,5,7,8},基数(不重复元素)为5.基数估计就是在误差可接受的范围内,快速计算基数。

使用场景:

  • 网站PV统计
  • 网站UV统计
  • 统计访问量(IP数)
  • 统计在线用户数
  • 统计每天搜索不同词条的个数
  • 统计文章真实阅读数

常用命令:

1.pfadd。

将所有元素参数添加到 Hyperloglog 数据结构中。

例如:

pfadd k1 v1 v2 v3

注意:添加元素到HyperLogLog中,如果内部有变动返回1,没有返回0。

2.pfcount。 

计算Hyperloglog 近似基数,可以计算多个Hyperloglog ,统计基数总数。

例如:

#计算book1的基数,结果为3

pfcount k1

#添加两个元素到book2中

pfadd k2 v3 v4

#统计两个key的基数总数,结果为5

pfcount k1 k2

3.pfmerge。

将一个或多个Hyperloglog(sourcekey1) 合并成一个Hyperloglog (destkey )。

例如:

#将k1和k2合并成k,结果为5

pfmerge k k1 k2

你可能感兴趣的:(redis,redis,数据库,缓存)