Redis数据类型全览

redis官网:https://redis.io
redis中文官网:http://www.redis.cn

以下内容是Redis数据类型全览,使用代码块的方式直观阅读。

一、基础点

1,Redis默认数据库是有16个,默认使用第一个。使用select可以进行切换数据库。
2,Redis默认端口号是6379。
3,使用flushdb和flushall清空数据库的数据。

二、Redis-key

掌握常用的redis key。

三、五大数据类型

以下是操作String类型的一些常见的命令操作,但不局限只有这些。

1、String

#  字符串内容的常规操作
#  set key value
#  get key
#  exists key #查看过期时间
#  append key value #追加值
#  keys * #查看所有的key
127.0.0.1:6379> set name xiong
OK
127.0.0.1:6379> get name
"xiong"
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> append name bo
(integer) 7
127.0.0.1:6379> get name
"xiongbo"
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> append age 18
(integer) 2
127.0.0.1:6379> keys *
1) "age"
2) "name"

# incr key #自加一操作
# decr key #自减一操作
# incrby key num,#赋值增加
# decrby key num,#赋值减少

127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> decr views
(integer) 1
127.0.0.1:6379> decr views
(integer) 0
127.0.0.1:6379> decr views
(integer) -1
127.0.0.1:6379> get views
"-1"
127.0.0.1:6379> incrby step 10
(integer) 10
127.0.0.1:6379> incrby step 5
(integer) 15
127.0.0.1:6379> decrby step 8
(integer) 7
127.0.0.1:6379> 

# getrange 获取一个范围内的值
# setrange 替换一个范围内的值
127.0.0.1:6379> set key1 "hello,world"
OK
127.0.0.1:6379> get key1
"hello,world"
127.0.0.1:6379> GETRANGE key1 0 3
"hell"
127.0.0.1:6379> GETRANGE key1 1 -1
"ello,world"
127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> SETRANGE key2 1 xx
(integer) 7
127.0.0.1:6379> get key2
"axxdefg"
127.0.0.1:6379> 

# setex key num value #设置过期时间
# setnx key value  #如果key不存在,则创建成功,否则失败
127.0.0.1:6379> setex key3 30 hello
OK
127.0.0.1:6379> ttl key3
(integer) 24
127.0.0.1:6379> get key3
"hello"
127.0.0.1:6379> setnx mykey tom 
(integer) 1
127.0.0.1:6379> keys *
 1) "key2"
 2) "key3"
 3) "myke"
127.0.0.1:6379> setnx mykey jack
(integer) 0
127.0.0.1:6379> get mykey
"tom"
127.0.0.1:6379> 


# mset 设置多个值
# mget 获取多个值
# msetnx 设置多个值,但msetnx是一个原子性操作,要么一起成功,要么一起失败。
mset age1 10 age2 12 age3 14
mget age1 age2
msetnx age1 123 age6 21

# getset 先get,然后再set
如果不存在值,返回nil
如果存在值,获取原来的值,赋值新的值

2,List

可以当作栈,队列,阻塞队列来使用。

# lpush 左边添加元素
# rpush 右边添加元素
127.0.0.1:6379> lpush list one
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> rpush list four
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "four"

# lpop 移除list的第一个元素
# rpop 移除list的最后一个元素
127.0.0.1:6379> LPOP list 1
1) "three"
127.0.0.1:6379> rpop list
"four"

# lindex 通过下标获得list中的某一个值
127.0.0.1:6379> lindex list 1
"one"

# lrem 移除list集合中指定个数的value,精确匹配
1) "three"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lrem list 2 three
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> 

# ltrim 截断元素,保留指定范围的元素
127.0.0.1:6379> LTRIM list  1 2

# rpoplpush 组合命令,移除最后一个元素,并将它添加到新的列表中
127.0.0.1:6379> rpoplpush list newlist

# lset 将列表中指定下标的值替换为另一个值,更新操作,不存在则报错
127.0.0.1:6379> lpush mylist tom age
(integer) 2
127.0.0.1:6379> LRANGE mylist 0 -1
1) "age"
2) "tom"
127.0.0.1:6379> lset mylist 0 jack
OK
127.0.0.1:6379> LRANGE mylist 0 -1
1) "jack"
2) "tom"


# linsert  将某个具体的value插入到列表中某个元素的前面或后面
127.0.0.1:6379> linsert mylist before tom king
(integer) 3
127.0.0.1:6379> LRANGE mylist 0 -1
1) "jack"
2) "king"
3) "tom"

小结:
1,List实际上是一个链表,左右都可以插入值
2,如果key不存在,就创建新的链表
3,如果key存在,就新增内容
4,如果移除了所有值,空链表,也代表不存在
5,在两边插入或改动值,效率最高,中间元素,相对效率会低一些
可以当作栈、队列、阻塞队列来使用。

3,Set

# sadd 往set集合中添加元素
# smembers 查看set集合中的所有元素
# sismember 判断某一个值在set集合中是否存在
# scard 获取set集合中元素的个数
127.0.0.1:6379> sadd myset hello world
(integer) 2
127.0.0.1:6379> smembers myset
1) "world"
2) "hello"
127.0.0.1:6379> sismember myset hello
(integer) 1
127.0.0.1:6379> sismember myset hello2
(integer) 0
1127.0.0.1:6379> scard myset
(integer) 2

#srem 移除set集合中的某个元素
127.0.0.1:6379> srem myset hello
(integer) 1
127.0.0.1:6379> smembers myset
1) "world"
127.0.0.1:6379> 

# srandmember 随意获取set集合中的一个元素
127.0.0.1:6379> srandmember myset
"world"

# spop 随机删除一些set集合中的元素
127.0.0.1:6379> spop myset
"hello"

# smove 将一个指定的值从一个set移动到另一个set集合中
127.0.0.1:6379> smove myset myset2 xiong
(integer) 1

# 比如微博,B站的关注数和共同好友等。
# sdiff 差集
# sinter 交集
# sunion 并集
127.0.0.1:6379> sdiff myset myset2
127.0.0.1:6379> sinter myset myset2
127.0.0.1:6379> sunion myset muset2

4,Hash(哈希)

Map集合,本质和String类型没有区别,还是一个简单的key-value。

# hset 新增Hash数据
# hget 获取某个元素
# hgetall 获取所有元素
# hdel  删除某个元素

127.0.0.1:6379> hset myhash name tom age 18
(integer) 2
127.0.0.1:6379> hgetall muyhash
(empty array)
127.0.0.1:6379> hgetall myhash
1) "name"
2) "tom"
3) "age"
4) "18"
127.0.0.1:6379> hdel myhash age
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "name"
2) "tom"

# hlen 获取map的元素个数
127.0.0.1:6379> hlen myhash
(integer) 1

# hex 获取map中某个元素是否存在
127.0.0.1:6379> hexists myhash name
(integer) 1

# hkeys 获取map中所有的key
# hvals 获取map中所有的value
127.0.0.1:6379> hkeys myhash
1) "name"
127.0.0.1:6379> hvals myhash
1) "tom"

# hincrby 指定某个变量自增
# hsetnx  如果不存在才可以设置,存在了就不可以设置,同String中的setnx命令
(integer) 1
127.0.0.1:6379> hincrby myhash age 1
(integer) 21
127.0.0.1:6379> hget myhash age
"21"
127.0.0.1:6379> hsetnx myhash age 12
(integer) 0
127.0.0.1:6379> hsetnx myhash email 192@qq.com
(integer) 1

Hash变更的数据user name age,尤其是用户信息之类的,经常变更的信息。Hash更适用于对象的存储,String更加适合字符串存储。

5,zset 有序集合

# zadd 添加zset集合元素
# ZRANGEBYSCORE 排序
# ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

127.0.0.1:6379> zadd salary 500 zhangsan
(integer) 1
127.0.0.1:6379> zadd salary 800 lisi
(integer) 1
127.0.0.1:6379> zadd salary 1000 wangwu
(integer) 1
127.0.0.1:6379> zrangebyscore salary 0 20000
1) "zhangsan"
2) "lisi"
3) "wangwu"

# zrem 移除zset集合中某个元素
# zcard 获取zset集合中元素个数

127.0.0.1:6379> zrem salary zhangsan
(integer) 1
127.0.0.1:6379> zcard salary
(integer) 2
127.0.0.1:6379> 

# zcount 返回有序集key中,score值在min和max之间
# (默认包括score值等于min或max)的成员
127.0.0.1:6379> zcount salary 100 20000
(integer) 2

案例思路:set 排序,存储班级成绩表,工资排序表
普通消息,1,重要消息,2,带权重进行判断
排行榜应用实现,取 Top N 等。

四、三种特殊数据类型

1,geospatial 地理位置

六个命令。

# geoadd 添加地理位置
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.32 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqin 114.05 22.52 shenzhen
(integer) 2

# geopos 查看某个位置的经度和维度
127.0.0.1:6379> geopos china:city shenzhen
1) 1) "114.04999762773513794"
   2) "22.5200000879503861"

# geodist 查看两个位置的直线记录,有单位
127.0.0.1:6379> geodist china:city chongqin beijing km
"1464.0708"

# georadius 以110 30 这个经纬度为中心,方圆500km以内的城市
# 前提是地理数据需要在redis数据中存在
127.0.0.1:6379> georadius china:city 110 30 500 km
1) "chongqin"

# 显示到中心位置的距离
127.0.0.1:6379> georadius china:city 110 30 500 km withdist
1) 1) "chongqin"
   2) "341.9374"

# 显示他人的定位信息
127.0.0.1:6379> georadius china:city 110 30 500 km withcoord
1) 1) "chongqin"
   2) 1) "106.49999767541885376"
      2) "29.52999957900659211"


# GEORADIUSBYMEMBER 找出指定元素周围的其他元素
127.0.0.1:6379> GEORADIUSBYMEMBER china:city chongqin 1000 km
1) "chongqin"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city chongqin 2000 km
1) "chongqin"
2) "shenzhen"
3) "shanghai"
4) "beijing"

# geohash 返回一个或多个位置元素的GeoHash字符串(很少用到)
# 如果两个字符串越接近,那么距离越近
127.0.0.1:6379> geohash china:city beijing shenzhen
1) "wx4fbxxfke0"
2) "ws10578st80"

geospatial 底层的实现就是ZSet,我们可以使用zset的命令来操作geo。

127.0.0.1:6379> zrange china:city 0 -1
1) "chongqin"
2) "shenzhen"
3) "shanghai"
4) "beijing"
127.0.0.1:6379> zrem china:city chongqin
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "shenzhen"
2) "shanghai"
3) "beijing"
127.0.0.1:6379> 

2,Hyperloglog

什么是基数?
不重复的元素,可以接受误差。

Redis Hyperloglog 基数统计的算法!
优点:占用的内存是固定的,2^64不同元素的基数,只需要花费12KB内存。如果要从内存角度来比较的话,Hyperloglog是首选。
应用场景:比如一个网站统计访问人数,一个人访问多次只算一次。
最开始可能用的是set保存用户的id,统计set中的元素数量作为标准判断。
但这样会存储大量的用户id,占用空间多。
这时候可以用redis的Hyperloglog来实现。
但Hyperloglog有0.81%的错误率。统计UV任务,可以忽略不计。

# pfadd 添加元素

127.0.0.1:6379> pfadd mykey a b c d e f g h i j
(integer) 1
127.0.0.1:6379> pfadd mykey2 i j k n m 
(integer) 1
127.0.0.1:6379> pfcount mykey2
(integer) 5
127.0.0.1:6379> pfadd mykey3 i j i j k n m 
(integer) 1
127.0.0.1:6379> pfcount mykey3
(integer) 5
127.0.0.1:6379> pfmerge mykey4 mykey mykey2
OK
127.0.0.1:6379> pfcount mykey4
(integer) 13
127.0.0.1:6379> 

如果允许容错,可以使用Hyperloglog。
如果不允许容错,就使用自己的set或者自己的数据类型。

3,Bitmaps

位存储。
Bitmaps 位图数据结构,都是操作二进制位来进行记录的,就只有0和1两种状态。
占用空间特别小,比如打卡,365天=365 bit,1 字节=8 bit,46个字节左右。

应用场景,比如打卡。

# setbit key offset value 设置值,offset是下标,value是0或1
# getbit key offset
# bitcount key  统计字符串被设置为1的bit数.

127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 1
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 0
(integer) 0
127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> bitcount sign
(integer) 3
127.0.0.1:6379> 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值