redis(1)(2)——数据类型和应用场景、命令行操作

一、连接

启动服务

./redis-server redis.conf

连接

./redis-cli -h 127.0.0.1 -p 6379

或者

./redis-cli

二、Redis数据类型和应用场景

Redis是一个Key-Value的存储系统,使用ANSI C语言编写。

注意:Redis中命令是忽略大小写,(set SET),key是不忽略大小写的 (NAME name)

 2.1 Key的设计

key的类型是字符串。

1. 用:分割

2. 把表名转换为key前缀, 比如: user:

3. 第二段放置主键值

4. 第三段放置列名

如:

email的key user:9:email

2.2 value

value的数据类型有:

  • 常用的:

     string字符串类型、list列表类型、set集合类型、sortedset(zset)有序集合类型、hash。

  • 不常见的:

      bitmap位图类型、geo地理位置类型。

   Redis5.0新增一种:stream类型

三、value详解 

3.1 string字符串类型

表达3种值的类型:字符串、整数、浮点数 100.01 是个六位的串

3.1.1 应用场景

incr用于乐观锁
incr:递增数字,可用于实现乐观锁 watch(事务)

setnx用于分布式锁
当value不存在时采用赋值,可用于实现分布式锁

 3.1.2 命令行命令

incr用于乐观锁
incr:递增数字,可用于实现乐观锁 watch(事务)

setnx用于分布式锁
当value不存在时采用赋值,可用于实现分布式锁

127.0.0.1:6379> setnx name zhangf #如果name不存在赋值
(integer) 1
127.0.0.1:6379> setnx name zhaoyun #再次赋值失败
(integer) 0
127.0.0.1:6379> get name
"zhangf"

正常赋值

127.0.0.1:6379> set age 18 NX PX 10000 #如果不存在赋值 有效期10秒
OK
127.0.0.1:6379> set age 20 NX #赋值失败
(nil)
127.0.0.1:6379> get age #age失效
(nil)
127.0.0.1:6379> set age 30 NX PX 10000 #赋值成功
OK
127.0.0.1:6379> get age
"30"

3.1.3 命令名称和用法

3.2 list列表类型

list列表类型可以存储有序、可重复的元素

获取头部或尾部附近的记录是极快的

list的元素个数最多为2^32-1个(40亿)

3.2.1 应用场景

1、作为栈或队列使用 列表有序可以作为栈和队列使用

2、可用于各种列表,比如用户列表、商品列表、评论列表等

3.2.2 命令行命令

127.0.0.1:6379> lpush list:1 1 2 3 4 5 3
(integer) 5
127.0.0.1:6379> lrange list:1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> lpop list:1 # 从0开始
"5"
127.0.0.1:6379> rpop list:1
"1"
127.0.0.1:6379> lindex list:1 1
"3"
127.0.0.1:6379> lrange list:1 0 -1
1) "4"
2) "3"
3) "2"
127.0.0.1:6379> lindex list:1 1
"3"
127.0.0.1:6379> rpoplpush list:1 list:2
"2"
127.0.0.1:6379> lrange list:2 0 -1
1) "2"
127.0.0.1:6379> lrange list:1 0 -1
1) "4"
2) "3"

3.2.3 命令名称和用法

3.3 set集合类型

Set:无序、唯一元素

集合中最大的成员数为 2^32 - 1

3.3.1 应用场景

适用于不能重复的且不需要顺序的数据结构

比如:关注的用户,还可以通过spop进行随机抽奖

3.3.2 命令行命令

127.0.0.1:6379> sadd set:1 a b c d
(integer) 4
127.0.0.1:6379> smembers set:1
1) "d"
2) "b"
3) "a"
4) "c"
127.0.0.1:6379> srandmember set:1
"c"
127.0.0.1:6379> srandmember set:1
"b"
127.0.0.1:6379> sadd set:2 b c r f
(integer) 4
127.0.0.1:6379> sinter set:1 set:2
1) "b"
2) "c"
127.0.0.1:6379> spop set:1
"d"
127.0.0.1:6379> smembers set:1
1) "b"
2) "a"
3) "c"

3.3.3 命令名称和用法

3.4 sortedset有序集合类型

SortedSet(ZSet) 有序集合: 元素本身是无序不重复的

每个元素关联一个分数(score)

可按分数排序,分数可重复

3.4.1 应用场景

由于可以按照分值排序,所以适用于各种排行榜。比如:点击排行榜、销量排行榜、关注排行榜等

3.4.2 命令行命令

127.0.0.1:6379> zadd hit:1 100 item1 20 item2 45 item3
(integer) 3
127.0.0.1:6379> zcard hit:1
(integer) 3
127.0.0.1:6379> zscore hit:1 item3
"45"
127.0.0.1:6379> zrevrange hit:1 0 -1
1) "item1"
2) "item3"
3) "item2"
127.0.0.1:6379>

3.4.3 命令名称和用法

3.5hash类型(散列表)

Redis hash 是一个 string 类型的 field 和 value 的映射表,它提供了字段和字段值的映射。 每个 hash 可以存储 2^32 - 1 键值对(40多亿)。

3.5.1 应用场景

对象的存储 ,表数据的映射

3.5.2 命令行命令

127.0.0.1:6379> hmset user:001 username zhangfei password 111 age 23 sex M
OK
127.0.0.1:6379> hgetall user:001
1) "username"
2) "zhangfei"
3) "password"
4) "111"
5) "age"
6) "23"
7) "sex"
8) "M"
127.0.0.1:6379> hget user:001 username
"zhangfei"
127.0.0.1:6379> hincrby user:001 age 1
(integer) 24
127.0.0.1:6379> hlen user:001
(integer) 4

3.5.3 命令名称和用法

3.6 bitmap位图类型

bitmap是进行位操作的 通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。 bitmap本身会极大的节省储存空间。

3.6.1 应用场景

1、用户每月签到,用户id为key , 日期作为偏移量 1表示签到

2、统计活跃用户, 日期为key,用户id为偏移量 1表示活跃

3、查询用户在线状态, 日期为key,用户id为偏移量 1表示在线

3.6.2 命令行命令

127.0.0.1:6379> setbit user:sign:1000 20200101 1 #id为1000的用户20200101签到
(integer) 0
127.0.0.1:6379> setbit user:sign:1000 20200103 1 #id为1000的用户20200103签到
(integer) 0
127.0.0.1:6379> getbit user:sign:1000 20200101 #获得id为1000的用户20200101签到状态
1 表示签到
(integer) 1
127.0.0.1:6379> getbit user:sign:1000 20200102 #获得id为1000的用户20200102签到状态
0表示未签到
(integer) 0
127.0.0.1:6379> bitcount user:sign:1000 # 获得id为1000的用户签到次数
(integer) 2
127.0.0.1:6379> bitpos user:sign:1000 1 #id为1000的用户第一次签到的日期
(integer) 20200101


127.0.0.1:6379> setbit 20200201 1000 1 #20200201的1000号用户上线
(integer) 0
127.0.0.1:6379> setbit 20200202 1001 1 #20200202的1000号用户上线
(integer) 0
127.0.0.1:6379> setbit 20200201 1002 1 #20200201的1002号用户上线
(integer) 0
127.0.0.1:6379> bitcount 20200201 #20200201的上线用户有2个
(integer) 2
127.0.0.1:6379> bitop or desk1 20200201 20200202 #合并20200201的用户和20200202上线
了的用户
(integer) 126
127.0.0.1:6379> bitcount desk1 #统计20200201和20200202都上线的用
户个数
(integer) 3

3.6.3 命令名称和用法

3.7 geo地理位置类型

geo是Redis用来处理位置信息的。

在Redis3.2中正式使用。主要是利用了Z阶曲线、Base32编码和 geohash算法

3.7.1 应用场景

1、记录地理位置

2、计算距离

3、查找"附近的人"

3.7.2 命令行命令

127.0.0.1:6379> geoadd user:addr 116.31 40.05 zhangf 116.38 39.88 zhaoyun 116.47
40.00 diaochan #添加用户地址 zhangf、zhaoyun、diaochan的经纬度
(integer) 3

127.0.0.1:6379> geohash user:addr zhangf diaochan #获得zhangf和diaochan的geohash码
1) "wx4eydyk5m0"
2) "wx4gd3fbgs0"
127.0.0.1:6379> geopos user:addr zhaoyun #获得zhaoyun的经纬度
1) 1) "116.38000041246414185"
2) "39.88000114172373145"
127.0.0.1:6379> geodist user:addr zhangf diaochan #计算zhangf到diaochan的距离,单
位是m
"14718.6972"
127.0.0.1:6379> geodist user:addr zhangf diaochan km #计算zhangf到diaochan的距离,
单位是km
"14.7187"
127.0.0.1:6379> geodist user:addr zhangf zhaoyun km
"19.8276"
127.0.0.1:6379> georadiusbymember user:addr zhangf 20 km withcoord withdist
count 3 asc
# 获得距离zhangf20km以内的按由近到远的顺序排出前三名的成员名称、距离及经纬度
#withcoord : 获得经纬度 withdist:获得距离 withhash:获得geohash码
1) 1) "zhangf"
2) "0.0000"
3) 1) "116.31000012159347534"
2) "40.04999982043828055"
2) 1) "diaochan"
2) "14.7187"
3) 1) "116.46999925374984741"
2) "39.99999991084916218"
3) 1) "zhaoyun"
2) "19.8276"
3) 1) "116.38000041246414185"
2) "39.88000114172373145"

3.7.3 命令名称和用法

3.6 stream数据流类型

stream是Redis5.0后新增的数据结构,用于可持久化的消息队列。

几乎满足了消息队列具备的全部内容,包括:

  • 消息ID的序列化生成
  • 消息遍历
  • 消息的阻塞和非阻塞读取
  • 消息的分组消费
  • 未完成消息的处理
  • 消息队列监控

每个Stream都有唯一的名称,它就是Redis的key,首次使用 xadd 指令追加消息时自动创建。

3.6.1 应用场景

消息队列的使用

3.6.2 命令行命令

127.0.0.1:6379> xadd topic:001 * name zhangfei age 23
"1591151905088-0"
127.0.0.1:6379> xadd topic:001 * name zhaoyun age 24 name diaochan age 16
"1591151912113-0"
127.0.0.1:6379> xrange topic:001 - +
1) 1) "1591151905088-0"
2) 1) "name"
2) "zhangfei"
3) "age"
4) "23"
2) 1) "1591151912113-0"
2) 1) "name"
2) "zhaoyun"
3) "age"
4) "24"
5) "name"
6) "diaochan"
7) "age"
8) "16"
127.0.0.1:6379> xread COUNT 1 streams topic:001 0
1) 1) "topic:001"
2) 1) 1) "1591151905088-0"
2) 1) "name"
2) "zhangfei"
3) "age"
4) "23"
#创建的group1
127.0.0.1:6379> xgroup create topic:001 group1 0
OK
# 创建cus1加入到group1 消费 没有被消费过的消息 消费第一条
127.0.0.1:6379> xreadgroup group group1 cus1 count 1 streams topic:001 >
1) 1) "topic:001"
2) 1) 1) "1591151905088-0"
2) 1) "name"
2) "zhangfei"
3) "age"
4) "23"
#继续消费 第二条
127.0.0.1:6379> xreadgroup group group1 cus1 count 1 streams topic:001 >
1) 1) "topic:001"
2) 1) 1) "1591151912113-0"
2) 1) "name"
2) "zhaoyun"
3) "age"
4) "24"
5) "name"
6) "diaochan"
7) "age"
8) "16"
#没有可消费
127.0.0.1:6379> xreadgroup group group1 cus1 count 1 streams topic:001 >
(nil)

3.6.3 命令名称和用法

四、Redis其它常用命令

官方命令大全网址:http://www.redis.cn/commands.html

4.1 scan

范围查询

scan 0 match * count 1000

4.2 exists

redis 127.0.0.1:6379> exists HongWan
(integer) 0
redis 127.0.0.1:6379> exists age
(integer) 1
redis 127.0.0.1:6379>

4.3 expire

redis 127.0.0.1:6379> set test 1 设置test的值为1
OK
redis 127.0.0.1:6379> get test 获取test的值
"1"
redis 127.0.0.1:6379> EXPIRE test 5 设置test的生存时间为5秒
(integer) 1
redis 127.0.0.1:6379> TTL test 查看test的生于生成时间还有1秒删除
(integer) 1
redis 127.0.0.1:6379>redis 127.0.0.1:6379> TTL test
(integer) -2
redis 127.0.0.1:6379> get test 获取test的值,已经删除
(nil)

4.4 rename

redis 127.0.0.1:6379> rename age age_new
OK
redis 127.0.0.1:6379> scan 0 match * count 100
1) "age_new"
redis 127.0.0.1:6379

4.5 type

显示指定key的数据类型

redis 127.0.0.1:6379> type addr
string
redis 127.0.0.1:6379> type myzset2
zset
redis 127.0.0.1:6379> type mylist
list

 4.6 encoding

显示指定value的数据类型

127.0.0.1:6379> object encoding name
"embstr"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值