redis笔记之八大数据结构

一、redis是什么

在说redis之前,我们需要理解一下nosql,非关系型数据库,在以往,我们主要是以关系型数据库为主的mysql就是一种关系型数据库,那么什么是关系型数据库呢?简单点说就是以行和列的形式存储数据,以便于用户理解,行和列汇总起来形成表,一组表汇总起来就形成了数据库。

那么什么是非关系型数据库呢?它代表着不仅仅是sql,没有申明查询语言,主要是以键值对进行查询,也有列存储,文档存储、图形数据库等等,并且非常好扩展,因为数据与数据之间没有关系,同时支持大数量的情况下的高性能(就redis来说,一秒钟可以写8万次,可以读11万次),另外呢,还支持各种各样的数据类型,光是这一点,就是关系型数据库无法比拟的,因为如果采用关系型数据库,那么就需要提前设计数据库,如果涉及的数据量极大的话,就无法进行设计了。

那么作为非关系型数据库里面最优秀的redis,开一篇文章讲解它就显得很有必要了。
redis=》remote dictionary server,叫做远程字典服务。

特性为:

  • 性能极高,Redis能支持超过100K+每秒的读写频率;
  • 丰富的数据类型,Redis支持二进制案例的StringsListsHashesSetsOrdered Sets数据类型操作;(下面会一一讲解)
  • 原子,Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行;
  • 丰富的特性 – Redis还支持publish/subscribe, 通知, key过期等等特性。

二、redis使用步骤

1.liunx上安装部署

#使用linux wget命令下载
wget http://download.redis.io/releases/redis-5.0.8.tar.gz
#解压源码
tar -zxvf redis-5.0.8.tar.gz
#进入解压后的目录进行编译
cd redis-5.0.8/
#基本的环境安装
yum install -y gcc-c++
#编译安装
make
make install

在这里插入图片描述

在linux环境下,redis的默认安装路径为/usr/local/bin

#/usr/local/bin目录下
mkdir myconfig
cp /opt/redis-5.0.8/redis.conf myconfig/
vim redis.conf

在这里插入图片描述

##启动redis服务
redis-server /usr/local/bin/myconfig/redis.conf 
#客户端连接redis
redis-cli -p 6379

至此,redis的环境已经搭建好了,接下来就是演示如何操作redis了。

首先,我们来一个并发测试吧!
在这里插入图片描述

//100个并发连接100000个请求
redis-benchmark -h localhost -p 6379 -c 100 -n 100000

2.8种数据结构类型演示

  1. String
//设置值,取值
127.0.0.1:6379> set key1 value1
OK
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379>
//追加字符串,如果不存在就默认相当于set
127.0.0.1:6379> append key1 海辉最棒
(integer) 18
127.0.0.1:6379> get key1
"value1\xe6\xb5\xb7\xe8\xbe\x89\xe6\x9c\x80\xe6\xa3\x92"
127.0.0.1:6379> append key2 value2
(integer) 6
//自增1,只接受integer类型,如果不是会报错。
127.0.0.1:6379> set num 1
OK
127.0.0.1:6379> incr num
(integer) 2
127.0.0.1:6379> incr num
(integer) 3
127.0.0.1:6379> incr num
(integer) 4
127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379> incr name
(error) ERR value is not an integer or out of range
//一个道理,自减1,只接受integer类型,如果不是会报错。
127.0.0.1:6379> decr num
(integer) 3
127.0.0.1:6379> decr num
(integer) 2
127.0.0.1:6379> decr name
(error) ERR value is not an integer or out of range
127.0.0.1:6379> 
//按照指定步长增加和减少
127.0.0.1:6379> incr num 20
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379> incrby num 20
(integer) 22
127.0.0.1:6379> incrby num 5
(integer) 27
127.0.0.1:6379> decrby num 5
(integer) 22
127.0.0.1:6379> decrby num 19
(integer) 3
127.0.0.1:6379> 
//截取字符串获取,0 -1 表示截取全部。
127.0.0.1:6379> get name
"zhangsan"
127.0.0.1:6379> getrange name 1 3
"han"
127.0.0.1:6379> getrange name 0 -1
"zhangsan"
127.0.0.1:6379> 
//还可以指定截取哪一部分,并用什么代替。
127.0.0.1:6379> set name lishi
OK
127.0.0.1:6379> setrange name 0 abc
(integer) 5
127.0.0.1:6379> get name
"abchi"
127.0.0.1:6379> 
//设置过期时间,多少秒过期,ttl实时获取还有多少秒过期
127.0.0.1:6379> setex age 20 18
OK
127.0.0.1:6379> ttl age
(integer) 17
127.0.0.1:6379> ttl age
(integer) 15
127.0.0.1:6379> ttl age
(integer) 14
127.0.0.1:6379> ttl age
(integer) 13
127.0.0.1:6379> ttl age
(integer) 10
127.0.0.1:6379> 
//sexnx如果不存在就创建,如果有就创建失败,返回0
127.0.0.1:6379> set name1 luhaihui
OK
127.0.0.1:6379> setnx name1 liushoaxiong
(integer) 0
127.0.0.1:6379> keys *
 1) "num"
 2) "key:__rand_int__"
 3) "mylist"
 4) "counter:__rand_int__"
 5) "myhash"
 6) "name"
 7) "name1"
 8) "key1"
 9) "key2"
10) "sex"
127.0.0.1:6379> setnx name2 liushaoxiong
(integer) 1
127.0.0.1:6379> 
127.0.0.1:6379> mset name3 zhangzan age3 18 name4 zhaoliu age4 20
OK
127.0.0.1:6379> mget name3 age3 name4 age4
1) "zhangzan"
2) "18"
3) "zhaoliu"
4) "20"
127.0.0.1:6379> 
//批量设置,批量获取,msetnx批量设置,不存在再设置,存在的话,设置失败
127.0.0.1:6379> mset name3 zhangzan age3 18 name4 zhaoliu age4 20
OK
127.0.0.1:6379> mget name3 age3 name4 age4
1) "zhangzan"
2) "18"
3) "zhaoliu"
4) "20"
127.0.0.1:6379> msetnx name3 lishi age3 100 name4 age4 500
(error) ERR wrong number of arguments for MSET
127.0.0.1:6379> msetnx name3 lishi age3 100 name4 wangwu  age4 500
(integer) 0
127.0.0.1:6379> 
//获取原来的值,并设置新的值,如果原来的值不存在,那么就返回null
127.0.0.1:6379> getset db mysql
(nil)
127.0.0.1:6379> getset db oracle
"mysql"
127.0.0.1:6379> 
  1. list
//list的基本操作,lpush,rpush,lrange,lpop,rpop,lindex
127.0.0.1:6379> lpush list1 one
(integer) 1
127.0.0.1:6379> lpush list1 two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 1
127.0.0.1:6379> lrange list1 0 -1
1) "two"
2) "one"
127.0.0.1:6379> lrange list1 0 1
1) "two"
2) "one"
127.0.0.1:6379> rpush list1 three
(integer) 3
127.0.0.1:6379> lrange list1 0 -1
1) "two"
2) "one"
3) "three"
127.0.0.1:6379> lpop list
"three"
127.0.0.1:6379> rpop list1
"three"
127.0.0.1:6379> lpop list
127.0.0.1:6379> lindex list1 0
"one"
llen key 获取长度,lrem key count element移除多少个元素,
127.0.0.1:6379> rpush list a
(integer) 1
127.0.0.1:6379> rpush list b
(integer) 2
127.0.0.1:6379> rpush list c
(integer) 3
127.0.0.1:6379> rpush list d
(integer) 4
127.0.0.1:6379> llen list
(integer) 4
127.0.0.1:6379> LREM lust 2 d
(integer) 0
127.0.0.1:6379> LREM lust 1 d
(integer) 0
127.0.0.1:6379> LREM lust 3 a
(integer) 0
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> LREM list 1 d
(integer) 1
127.0.0.1:6379> lrange list 0 -1 
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> 
//ltrim:对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
127.0.0.1:6379> lrange list 0 -1 
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> rpush list d
(integer) 4
127.0.0.1:6379> rpush list e
(integer) 5
127.0.0.1:6379> rpush list f
(integer) 6
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
127.0.0.1:6379> ltrim list 1 4
OK
127.0.0.1:6379> lrange list 0 -1
1) "b"
2) "c"
3) "d"
4) "e"
127.0.0.1:6379> 
#移除列表的最后一个元素,到新的列表中
127.0.0.1:6379> rpoplpush list newlist
"e"
127.0.0.1:6379> lrange list 0 -1
1) "b"
2) "c"
3) "d"
127.0.0.1:6379> 
#exists判断是否存在 lset设置值是否存在,如果对应下标不存在,那么就报错。
127.0.0.1:6379> exists list
(integer) 1
127.0.0.1:6379> lset list 0 love 
OK
127.0.0.1:6379> lset list 100 myfamily
(error) ERR index out of range
127.0.0.1:6379> 
#往前插入,往后插入
127.0.0.1:6379> lrange list 0 -1
1) "love"
2) "c"
3) "d"
127.0.0.1:6379> linsert list before love I
(integer) 4
127.0.0.1:6379> linsert list after love myfamily
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "I"
2) "love"
3) "myfamily"
4) "c"
5) "d"
127.0.0.1:6379> 
  1. set
#sadd添加元素,smember添加元素,sismember判断是否存在一个元素。scard判断元素的个数,srem移除元素,srandmember随机获取元素。
127.0.0.1:6379> sadd list v1
(integer) 1
127.0.0.1:6379> sadd list v2
(integer) 1
127.0.0.1:6379> sadd list v3
(integer) 1
127.0.0.1:6379> sadd list v4
(integer) 1
127.0.0.1:6379> SMEMBERS list
1) "v1"
2) "v4"
3) "v3"
4) "v2"
127.0.0.1:6379> sis
(error) ERR unknown command `sis`, with args beginning with: 
127.0.0.1:6379> SISMEMBER list v2
(integer) 1
127.0.0.1:6379> SISMEMBER list v8
(integer) 0
127.0.0.1:6379> SCARD list
(integer) 4
127.0.0.1:6379> srem list v1
(integer) 1
127.0.0.1:6379> SMEMBERS list
1) "v4"
2) "v3"
3) "v2"
127.0.0.1:6379> SRANDMEMBER list
"v4"
127.0.0.1:6379> SRANDMEMBER list 2
1) "v4"
2) "v2"
127.0.0.1:6379> 
#spop随机移除元素,也可以移除多个,smove移动指定的元素到另外一个集合
127.0.0.1:6379> SMEMBERS list
1) "v4"
2) "v3"
3) "v2"
127.0.0.1:6379> spop list 1
1) "v3"
127.0.0.1:6379> spop list 1
1) "v4"
127.0.0.1:6379> SMEMBERS list
1) "v2"
127.0.0.1:6379> sadd list hello
(integer) 1
127.0.0.1:6379> sadd list hello1
(integer) 1
127.0.0.1:6379> sadd list hello2
(integer) 1
127.0.0.1:6379> SMOVE list list2 hello
(integer) 1
127.0.0.1:6379> SMOVE list list2 hello3
(integer) 0
127.0.0.1:6379> 
  1. hash
#hset设置字段,可以设置多个、hget获取指定hash表的字段,hgetall获取所有的hash表的键值对,
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> hset myhash filed v1 filed2 v2
(integer) 2
127.0.0.1:6379> hget myhash filed
"v1"
127.0.0.1:6379> hget myhash filed2   #获取指定的值
"v2"
127.0.0.1:6379> hgetall myhash  
1) "filed"
2) "v1"
3) "filed2"
4) "v2"
127.0.0.1:6379> hmset key1 v1 key2 v2
(error) ERR wrong number of arguments for 'hmset' command
127.0.0.1:6379> hmset myhash key1 v1 key2 v2   #给hash表设置多个键值对。
OK
127.0.0.1:6379> hgetall myhash  #获取所有的键值对
1) "filed"
2) "v1"
3) "filed2"
4) "v2"
5) "key1"
6) "v1"
7) "key2"
8) "v2"
127.0.0.1:6379> hdel myhash key1  #删除表中的某个键
(integer) 1
127.0.0.1:6379> hlen myhash  #获取某个hash表的长度
(integer) 3
127.0.0.1:6379> HEXISTS myhash key2  #判断某个键是否存在
(integer) 1
127.0.0.1:6379> hkeys myhash   #获取所有的键
1) "filed"
2) "filed2"
3) "key2"
127.0.0.1:6379> HVALS myhash   #获取所有的值
1) "v1"
2) "v2"
3) "v2"
4) "3"
5) "hello"
127.0.0.1:6379> hset myhash key3 1
(integer) 1
127.0.0.1:6379> hincrby myhash key3 2
(integer) 3
127.0.0.1:6379> hsetnx hash filed4 hello
(integer) 1
127.0.0.1:6379> hsetnx myhash filed4 hello
(integer) 1
127.0.0.1:6379> hsetnx myhash filed4 world
(integer) 0
127.0.0.1:6379> HVALS myhash
1) "v1"
2) "v2"
3) "v2"
4) "3"
5) "hello"
127.0.0.1:6379> 
#设置对象的值,用hash数据结构来存储对象信息,比如user会很方便。
127.0.0.1:6379> HMSET user:1 name zhangsan age 20
OK
127.0.0.1:6379> hget user:1 name
"zhangsan"
127.0.0.1:6379> hget user:1 age
"20"
127.0.0.1:6379> 
  1. zset
#zadd可以用于添加一个,也可以用于添加多个,在添加的时候,如果score值没有改变,那么添加失败,如果score发生了改变,那么可以添加成功。
127.0.0.1:6379> zadd myset 1 zhangsan
(integer) 1
127.0.0.1:6379> zadd myset 2 lisi
(integer) 1
127.0.0.1:6379> zadd myset 3 wnagwu
(integer) 1
127.0.0.1:6379> zadd myset 2 zhaoliu
(integer) 1
127.0.0.1:6379> zadd myset 2 lisi
(integer) 0
127.0.0.1:6379> zadd myset 20 lisi
(integer) 0
127.0.0.1:6379> 
127.0.0.1:6379> zrange myset 0 -1 withscores
1) "zhangsan"
2) "1"
3) "zhaoliu"
4) "2"
5) "wnagwu"
6) "3"
7) "lisi"
8) "20"
127.0.0.1:6379>
127.0.0.1:6379> zadd myset 5 luhaihui 6 haihui 7 hai 8 hui
(integer) 4
#获取某个member的值
127.0.0.1:6379> zscore myset luhaihui
"5"
127.0.0.1:6379> zrange myset 0 -1 withscores
 1) "zhangsan"
 2) "1"
 3) "zhaoliu"
 4) "2"
 5) "wnagwu"
 6) "3"
 7) "luhaihui"
 8) "5"
 9) "haihui"
10) "6"
11) "hai"
12) "7"
13) "hui"
14) "8"
15) "lisi"
16) "20"
127.0.0.1:6379> zscore myset lisi
"20"
127.0.0.1:6379> 
#增加增量zincrby key increament member,如果这个member不存在,那么就相当于增加一个member
127.0.0.1:6379> ZINCRBY myset 10 luhaihui
"15"
127.0.0.1:6379> clear
127.0.0.1:6379> zrange myset 0 -1 withscores
 1) "zhangsan"
 2) "1"
 3) "zhaoliu"
 4) "2"
 5) "wnagwu"
 6) "3"
 7) "haihui"
 8) "6"
 9) "hai"
10) "7"
11) "hui"
12) "8"
13) "luhaihui"
14) "15"
15) "lisi"
16) "20"
127.0.0.1:6379> ZINCRBY myset 20 lisi
"40"
127.0.0.1:6379> ZSCORE myset lisi
"40"
127.0.0.1:6379> ZINCRBY myset -5 heihei
"-5"
127.0.0.1:6379> zrange myset 0 -1 withscores
 1) "heihei"
 2) "-5"
 3) "zhangsan"
 4) "1"
 5) "zhaoliu"
 6) "2"
 7) "wnagwu"
 8) "3"
 9) "haihui"
10) "6"
11) "hai"
12) "7"
13) "hui"
14) "8"
15) "luhaihui"
16) "15"
17) "lisi"
18) "40"
127.0.0.1:6379> 

#获取成员数量
127.0.0.1:6379> Zcard myset
(integer) 9
127.0.0.1:6379> zcount myset 1 10   #返回包括最小值到最大值score之间的所有成员member的个数
(integer) 6 
127.0.0.1:6379> 
#zrevrange key start end [withscores] 先倒叙再按照指定下标取值
127.0.0.1:6379> zrange myset 0 -1 withscores
 1) "heihei"
 2) "-5"
 3) "zhangsan"
 4) "1"
 5) "zhaoliu"
 6) "2"
 7) "wnagwu"
 8) "3"
 9) "haihui"
10) "6"
11) "hai"
12) "7"
13) "hui"
14) "8"
15) "luhaihui"
16) "15"
17) "lisi"
18) "40"
127.0.0.1:6379> ZREVRANGE myset 0 2 withscores
1) "lisi"
2) "40"
3) "luhaihui"
4) "15"
5) "hui"
6) "8"
127.0.0.1:6379> 
#返回指定区间score的结果,包含min和max参数本身。
127.0.0.1:6379> zrange myset 0 -1 withscores
 1) "heihei"
 2) "-5"
 3) "zhangsan"
 4) "1"
 5) "zhaoliu"
 6) "2"
 7) "wnagwu"
 8) "3"
 9) "haihui"
10) "6"
11) "hai"
12) "7"
13) "hui"
14) "8"
15) "luhaihui"
16) "15"
17) "lisi"
18) "40"
127.0.0.1:6379> zrangebyscore myset 10 20 withscores
1) "luhaihui"
2) "15"
127.0.0.1:6379> ZRANGEBYSCORE myset -inf +inf withscores  #无线小到无线大之间,用于找到该set本身的score的最小值和最大值,该命令本质上就跟zrange myset 0 -1 withscores一致了。
 1) "heihei"
 2) "-5"
 3) "zhangsan"
 4) "1"
 5) "zhaoliu"
 6) "2"
 7) "wnagwu"
 8) "3"
 9) "haihui"
10) "6"
11) "hai"
12) "7"
13) "hui"
14) "8"
15) "luhaihui"
16) "15"
17) "lisi"
18) "40"
127.0.0.1:6379> 
#排名,返回结果为6,说明排名第七。
127.0.0.1:6379> zrank myset hui  #有序,0名为score最小的
(integer) 6
127.0.0.1:6379> zrevrank myset hui #有序,0名为score最大的。
(integer) 2
#移除某个元素
127.0.0.1:6379> zrange myset 0 -1 withscores
 1) "heihei"
 2) "-5"
 3) "zhangsan"
 4) "1"
 5) "zhaoliu"
 6) "2"
 7) "wnagwu"
 8) "3"
 9) "haihui"
10) "6"
11) "hai"
12) "7"
13) "hui"
14) "8"
15) "luhaihui"
16) "15"
127.0.0.1:6379> zrem myset heihei
(integer) 1
127.0.0.1:6379> 
  1. geospatial地理位置
#录入地图经纬度信息
127.0.0.1:6379> geoadd city 115.859846 28.688538 南昌
(integer) 1
127.0.0.1:6379> geoadd city 115.975203 29.686023 九江
(integer) 1
127.0.0.1:6379> geo add city 116.398176 39.933222 北京
(error) ERR unknown command `geo`, with args beginning with: `add`, `city`, `116.398176`, `39.933222`, `北京`, 
127.0.0.1:6379> geoadd city 116.398176 39.933222 北京
(integer) 1
127.0.0.1:6379> geoadd city 118.749251 32.071286 济南 114.420637 30.569709 武汉 
(integer) 2
127.0.0.1:6379> 

#获取某个城市的经纬度信息
127.0.0.1:6379> geopos city 北京
1) 1) "116.39817506074905396"
   2) "39.93322268190637914"
127.0.0.1:6379> geopos city 九江
1) 1) "115.97520142793655396"
   2) "29.68602180524853651"
127.0.0.1:6379> 
#计算城市与城市之间的距离,直线距离
127.0.0.1:6379> geodist city 北京 九江 km
"1140.4083"
#显示以南昌为中心的距离南昌500km以内的所有城市(已在city这个集合当中的),withcoord附带返回经纬度,withdist返回距离
127.0.0.1:6379> georadiusbymember city 南昌 500 km withcoord withdist
1) 1) "\xe5\x8d\x97\xe6\x98\x8c"
   2) "0.0000"
   3) 1) "115.85984498262405396"
      2) "28.68853805685619562"
2) 1) "\xe6\xad\xa6\xe6\xb1\x89"
   2) "251.2722"
   3) 1) "114.42063599824905396"
      2) "30.56970924719235683"
3) 1) "\xe4\xb9\x9d\xe6\xb1\x9f"
   2) "111.5104"
   3) 1) "115.97520142793655396"
      2) "29.68602180524853651"
4) 1) "\xe6\xb5\x8e\xe5\x8d\x97"
   2) "467.3139"
   3) 1) "118.74924927949905396"
      2) "32.07128566614823484"
127.0.0.1:6379> 
#降序排序距离(desc),升序asc
127.0.0.1:6379> georadiusbymember city 南昌 500 km withcoord withdist desc
1) 1) "\xe6\xb5\x8e\xe5\x8d\x97"
   2) "467.3139"
   3) 1) "118.74924927949905396"
      2) "32.07128566614823484"
2) 1) "\xe6\xad\xa6\xe6\xb1\x89"
   2) "251.2722"
   3) 1) "114.42063599824905396"
      2) "30.56970924719235683"
3) 1) "\xe4\xb9\x9d\xe6\xb1\x9f"
   2) "111.5104"
   3) 1) "115.97520142793655396"
      2) "29.68602180524853651"
4) 1) "\xe5\x8d\x97\xe6\x98\x8c"
   2) "0.0000"
   3) 1) "115.85984498262405396"
      2) "28.68853805685619562"
127.0.0.1:6379> 
#georadius,跟georadiusbymember不一样,它需要手动指定经纬度信息,所以一般来说,后者使用的比较多。
127.0.0.1:6379> georadius city 112.882551  28.060225  300 km withcoord withdist desc
1) 1) "\xe5\x8d\x97\xe6\x98\x8c"
   2) "299.6229"
   3) 1) "115.85984498262405396"
      2) "28.68853805685619562"
127.0.0.1:6379>
#返回元素的hash值,一个城市对应于一个hash
127.0.0.1:6379> geohash city 北京
1) "wx4g0twefh0"
127.0.0.1:6379> geohash city 南昌
1) "wt47hqwdf50"
127.0.0.1:6379> 
  1. hyperloglog(一般用于网站的uv,一个人访问网页多次,还是算作一个人)
#如果添加成功返回1,添加不成功返回0(当内部已经有的话,添加失败,返回0)
127.0.0.1:6379> pfadd database redis mysql oracle
(integer) 1
127.0.0.1:6379> pfcount database
(integer) 3
127.0.0.1:6379> pfadd database mongodb
(integer) 1
127.0.0.1:6379> pfcount database
(integer) 4
127.0.0.1:6379> pfadd database redis
(integer) 0
127.0.0.1:6379> pfcount database
(integer) 4
127.0.0.1:6379> 
  1. bitmaps
    位图信息,一般用于保存用户的信息,只有两个状态,使用二进制0,1表示。
    常见的比如登录、未登录,活跃、不活跃,打卡、未打卡等等。
#如下就是显示一周打卡情况的
127.0.0.1:6379> setbit sign 0 0
(integer) 0
127.0.0.1:6379> set sign 1 1
(error) ERR syntax error
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> setbit sign 5 1
(integer) 0
127.0.0.1:6379> setbit sign 6 1
(integer) 0
127.0.0.1:6379> getbit sign 5
(integer) 1
127.0.0.1:6379> 
#返回状态为1的信息,也可以理解为统计一周打卡的数量
127.0.0.1:6379> bitcount sign
(integer) 4
127.0.0.1:6379> 

三、总结

至此,redis的基本数据类型的操作演示完毕。需要记住的就是,什么场景下,使用什么样的数据结构。

比如bitmaps使用场景:可以用来统计只有两个状态的那些数据:打卡不打卡,活跃不活跃,登录未登录等等。

hyperloglog可以用来统计网站的uv(用户访问量)

geospatial可以用来计算位置,地图

String用来存储键值对,key-value

list可以用来实现消息队列lpop-rpushlpush-rpop)实现队列的功能,另外也可以用来实现朋友圈的点赞列表,评论列表,排放榜等等。lpush插入新的元素,通过lrange命令查看最新的元素列表。

hash可以用来实现购物车功能(hset [key] [field] [value] 命令, 可以实现以用户Id,商品Id为field,商品数量为value,恰好构成了购物车的3个要素。),也可以用来存储对象(hash类型的(key, field, value)的结构与对象的(对象id, 属性, 值)的结构相似,也可以用来存储对象。)

set,可以用来实现好友、关注、粉丝、感兴趣的人集合(sinter命令可以获得A和B两个用户的共同好友;
sismember命令可以判断A是否是B的好友;
scard命令可以获取好友数量;
关注时,smove命令可以将B从A的粉丝集合转移到A的好友集合),也可以用来实现首页随机展示(美团首页有很多推荐商家,但是并不能全部展示,set类型适合存放所有需要展示的内容,而srandmember命令则可以从中随机获取几个。)

zset可以用来做排行榜

猜你喜欢

转载自blog.csdn.net/qq_41486775/article/details/113574935