redis拾遗(一)——基本的数据类型

准备

安装

Linux环境下的redis安装,可以参考这篇博客,其中对相关配置也有提及,传送门:redis linux 安装。

命令别名配置

为了启动方便,需要配置别名的命令,否则每次都指定启动命令,启动的配置文件,是个很繁琐的工作,这里需要设置命令的别名,这里为了使得每一次系统启动别名都能生效,就采用修改配置文件的方式来定义别名

1、修改.bashrc文件,加入如下命令

# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
##指定到redis的bin目录
alias redis-bin='cd /usr/local/software/redis-5.0.0/bin'
##执行指定的redis-server启动脚本,指定配置文件
alias redis-server='./redis-server /usr/local/software/redis-5.0.0/conf/redis.conf'
##执行redis-cli客户端
alias redis-cli='./redis-cli'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

2、配置之后的结果如下所示

##通过这个命令直接定位到了redis的目录
[root@localhost /]# redis-bin
## 直接后台启动redis-server
[root@localhost bin]# redis-server 
4265:C 27 Jun 2020 10:08:15.829 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4265:C 27 Jun 2020 10:08:15.829 # Redis version=5.0.0, bits=64, commit=00000000, modified=0, pid=4265, just started
4265:C 27 Jun 2020 10:08:15.829 # Configuration loaded
##直接启动了redis的客户端
[root@localhost bin]# redis-cli 
127.0.0.1:6379>

几种数据类型

如果被问到redis的数据类型有几种,有些程序员可能只会回答5种,但是其实在某一个版本之后,redis的类型已经不止5种了,官网中关于redis的数据类型其实介绍有如下几种

string,Hash,Set,List,Zset,Hyperloglog,Geo,Streams。其中前5中是基本的数据类型,后三种算是redis的高级数据类型。

string

存储的类型

String可以用来存储字符串,整数,浮点数。同时也可以单个和批量的操作

简单命令实例

单个

127.0.0.1:6379> set name coderMan
OK
127.0.0.1:6379> get name
"coderMan"
##判断是否存在
127.0.0.1:6379> exists coderMan
(integer) 0 ##0表示不存在
127.0.0.1:6379> exists name
(integer) 1 ##1表示存在
127.0.0.1:6379> get name
"coderMan"
127.0.0.1:6379> del name
(integer) 1

批量

127.0.0.1:6379> set name1 codehole
OK
127.0.0.1:6379> set name2 holycoder
OK
## 批量获取
127.0.0.1:6379> mget name1 name2
1) "codehole"
2) "holycoder"
## 批量设置
127.0.0.1:6379> mset name1 boy name2  girl name3 unknown
OK
127.0.0.1:6379> mget name1 name2 name3
1) "boy"
2) "girl"
3) "unknown"
##批量删除
127.0.0.1:6379> del name1 name2 name3
(integer) 3

过期

127.0.0.1:6379> set name coderMan
OK
127.0.0.1:6379> expire name 6
(integer) 1
127.0.0.1:6379> get name
"coderMan"
127.0.0.1:6379> get name #5s之后
(nil)
## 基于此可实现分布式锁。关于分布式锁后续我们再总结
127.0.0.1:6379> setnx name coderMan
(integer) 1
127.0.0.1:6379> setnx name TestExist
(integer) 0
127.0.0.1:6379> get name
"coderMan" #没有变化

计数

127.0.0.1:6379> set age 10
OK
127.0.0.1:6379> incr age
(integer) 11
127.0.0.1:6379> incrby age 7
(integer) 18
127.0.0.1:6379> incrby age -6
(integer) 12

应用场景

分布式锁,全局id,计数器,限流,位统计(bitmap)

list

存储类型

存储有序的字符串,元素可以重复,可以作为队列也可以作为栈。

简单命令实例

右进左出

127.0.0.1:6379> rpush books python java golang
(integer) 3
127.0.0.1:6379> llen books
(integer) 3
127.0.0.1:6379> lpop books
"python"
127.0.0.1:6379> lpop books
"java"
127.0.0.1:6379> lpop books
"golang"
127.0.0.1:6379> lpop books
(nil)

右进右出

127.0.0.1:6379> rpush books python java golang
(integer) 3
127.0.0.1:6379> rpop books
"golang"
127.0.0.1:6379> rpop books
"java"
127.0.0.1:6379> rpop books
"python"
127.0.0.1:6379> rpop books
(nil)

简单的截取操作

127.0.0.1:6379> rpush books python java golang
(integer) 3
## 相当于java链表中的get(int index)方法,底层会遍历list,找到指定的元素
127.0.0.1:6379> lindex books 1
"java"
## lrange有两个参数,一个表示开始位置,一个表示结束位置,lrange key 0 -1 表示获取所有列表中的元素
127.0.0.1:6379> lrange books 0 -1
1) "python"
2) "java"
3) "golang"
## ltrim也有两个参数,一个表示开始位置,一个表示结束位置,ltrim key start end ,表示从start到end的元素全部保留,其余全部丢弃。
127.0.0.1:6379> ltrim books 1 -1
OK
127.0.0.1:6379> ltrim books 0 1
OK
127.0.0.1:6379> lrange books 0 -1
1) "java"
2) "golang"
127.0.0.1:6379> ltrim books 1 0
OK
127.0.0.1:6379> lrange books 0 -1
(empty list or set)

应用场景

消息队列,用户操作时间线,调用链路等。

hash

hash的数据结构可以用如下图表示,与数据结构知识中的hash表差别不大,只是在redis中需要一个key值去标识这个map。

redis拾遗(一)——基本的数据类型_第1张图片

存储类型

包含键值对的无序散列表。value只能是字符串,不能嵌套其他类型。

简单命令实例

127.0.0.1:6379> hset books java "think in java"
(integer) 1
127.0.0.1:6379> hset books golang "concurrency in go"
(integer) 1
127.0.0.1:6379> hset books python "python cookbook"
(integer) 1
127.0.0.1:6379> hgetall books
1) "java"
2) "think in java"
3) "golang"
4) "concurrency in go"
5) "python"
6) "python cookbook"
127.0.0.1:6379> hlen books
(integer) 3
127.0.0.1:6379> hget books java
"think in java"
127.0.0.1:6379> hset books golang "learning go programming"
(integer) 0
127.0.0.1:6379> hget books golang
"learning go programming"
## 批量设置
127.0.0.1:6379> hmset books java "effective java" python "learning python" golang "modern golang progarmming"
OK

应用场景

string能做的事情,hash都能做。

set

存储类型

存储string类型的无序集合。

简单操作命令

## 往set中增加元素
127.0.0.1:6379> sadd books java
(integer) 1
127.0.0.1:6379> sadd books java
(integer) 0
127.0.0.1:6379> sadd books java golang
(integer) 1
## 列出set中所有的元素
127.0.0.1:6379> smembers books
1) "java"
2) "golang"
## 判断是否是其中的元素
127.0.0.1:6379> sismember books java
(integer) 1
127.0.0.1:6379> sismember books rust
(integer) 0
## 计算元素个数
127.0.0.1:6379> scard books
(integer) 2
## 随机弹出一个元素
127.0.0.1:6379> spop books
"golang"

应用场景

抽奖,签到打开,点赞,商品标签等。

zset

存储类型

有序的一个set,每个元素有一个score,可以根据score进行排序

redis拾遗(一)——基本的数据类型_第2张图片

简单命令实例

## 增加各种元素
127.0.0.1:6379> zadd books 9.0 "think in java"
(integer) 1
127.0.0.1:6379> zadd books 8.9 "java concurrency"
(integer) 1
127.0.0.1:6379> zadd books 8.6 "java cookbook"
(integer) 1
## 按照score排序输出,参数区间为排名范围
127.0.0.1:6379> zrange books 0 -1
1) "java cookbook"
2) "java concurrency"
3) "think in java"
127.0.0.1:6379> zrevrange books 0 -1
1) "think in java"
2) "java concurrency"
3) "java cookbook"
## 计算zset中的元素个数
127.0.0.1:6379> zcard books
(integer) 3
## 获取指定key的value
127.0.0.1:6379> zscore books "think in java"
"9"
## 根据分值区间遍历zset
127.0.0.1:6379> zrangebyscore books 0 8.91
1) "java cookbook"
2) "java concurrency"
## 根据(-∞,8.91]分数区间进行遍历
127.0.0.1:6379> zrangebyscore books -inf 8.91 withscores
1) "java cookbook"
2) "8.5999999999999996"
3) "java concurrency"
4) "8.9000000000000004"
## 删除
127.0.0.1:6379> zrem books "java concurrency"
(integer) 1
127.0.0.1:6379> zrange books 0 -1
1) "java cookbook"
2) "think in java"

应用场景

排行榜

总结

简单总结了一下redis的基本数据结构。

你可能感兴趣的:(分布式,redis)