【Redis】Redis 入门

借鉴枫枫知道

一、连接 redis

1.1 命令行连接

cpp 复制代码
// 完整的命令
redis-cli -h 127.0.0.1 -p 6379 -a password

// 简写
redis-cli

// 认证,进行redis之后
auth password

1.2 go 代码连接

Go 复制代码
package main

import (
    "fmt"
    "github.com/go-redis/redis"
)

var DB *redis.Client

func Connect() {
    redisDB := redis.NewClient(&redis.Options {
        Addr: "127.0.0.1:6379",
        Password: "redis",
        DB:  1,
    })

    _, err := redisDB.Ping().Result()
    if err != nil {
        panic(err)
    }
    DB = redisDB
}

二、redis 五大数据类型

注意:redis 中的数据都是在内存里面的,redis 服务重启之后,数据会被清空

2.1 string(字符串)

字符串 String 是 redis 最简单的数据结构,可以存储字符串、整数或者浮点数。最常用的应用场景就是对象缓存。

命令总结:

set name hrx 设置这个key

get name 获取这个key

exists name 判断这个key是否存在

del name 删除这个key

getset name lisi 如果不存在值,则返回nil,set是会执行的;

如果存在值,获取原来的值,并设置新的值

mset n1 zhangsan n2 lisi 批量设置key

incr n 自增1

decr n 自减1

incrby n 10 自增10

decrby n 10 自减10

setex name 20 hrx 设置过期时间为20秒

ttl name 查看还有多久过期

expire name 20 设置过期时间为20秒

Go 复制代码
redis-cli
127.0.0.1:6379> auth redis  # 登录
OK
127.0.0.1:6379> set name fengfeng   # 设置
OK
127.0.0.1:6379> get name  # 获取
"fengfeng"
127.0.0.1:6379> exists name  # 判断这个key是否存在
(integer) 1
127.0.0.1:6379> exists name1 
(integer) 0
127.0.0.1:6379> del name  # 删除这个key
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> GETSET name1 lisi # 如果不存在值,则返回 nil,set是会执行的
(nil)
127.0.0.1:6379> GETSET name1 lisi #  如果存在值,获取原来的值,并设置新的值
"lisi"

批量操作

Go 复制代码
127.0.0.1:6379> mset n1 zhangsan n2 lisi
OK
127.0.0.1:6379> get n1
"zhangsan"
127.0.0.1:6379> get n2
"lisi"

计数操作:

自增1,自减1

Go 复制代码
127.0.0.1:6379> get n
(nil)
127.0.0.1:6379> incr n  # 自增1
(integer) 1  # 当前这个n的值
127.0.0.1:6379> get n
"1"
127.0.0.1:6379> incr n
(integer) 2
127.0.0.1:6379> get n
"2"
127.0.0.1:6379> decr n  # 自减1
(integer) 1
127.0.0.1:6379> get n
"1"
127.0.0.1:6379> decr n
(integer) 0
127.0.0.1:6379> get n
"0"
127.0.0.1:6379> decr n
(integer) -1
127.0.0.1:6379> get n
"-1"

自增n,自减n

Go 复制代码
127.0.0.1:6379> get n
(nil)
127.0.0.1:6379>
127.0.0.1:6379> INCRBY n 10
(integer) 10
127.0.0.1:6379> INCRBY n 11
(integer) 21
127.0.0.1:6379> get n
"21"
127.0.0.1:6379> DECRBY n 5
(integer) 16
127.0.0.1:6379> get n
"16"

过期操作

setex 的单位是秒

Go 复制代码
127.0.0.1:6379> setex name 20 fengfeng
OK
127.0.0.1:6379> get name
"fengfeng"
127.0.0.1:6379> ttl name  # 查看还有多久过期
(integer) 12
127.0.0.1:6379> ttl name  # -2表示已过期
(integer) -2
127.0.0.1:6379> get name
(nil)

expire 设置一个 key 的过期时间(如果不设置过期时间,ttl 显示的结果是 -1 表示永不过期)

Go 复制代码
127.0.0.1:6379> set name fengfeng
OK
127.0.0.1:6379> ttl name  # 现在是永不过期
(integer) -1
127.0.0.1:6379> expire name 10
(integer) 1
127.0.0.1:6379> ttl name
(integer) 6
127.0.0.1:6379> ttl name  # 现在是过期了
(integer) -2

2.2 list(列表)

redis 的列表就相当于 go 里面的切片

命令总结:

rpush list zhangsan lisi wangwu xiaoming 从右边向左边推入四个元素

llen list 查询列表的长度

lrange list 0 -1 查看列表中的全部元素

rpop list 从右边推出一个元素出来

lpop list 从左边推出一个元素出来

lpush list zhangsan lisi wangwu xiaoming 从左边向右边推入四个元素

cpp 复制代码
rpush list zhangsan lisi wangwu  xiaoming  # 从右边向左边推入四个元素
4 # 返回列表的长度
127.0.0.1:6379> llen list # 查列表的长度
4
127.0.0.1:6379> lrange list 0 -1  # 查看列表的全部元素
zhangsan
lisi
wangwu
xiaoming
127.0.0.1:6379> rpop list  # 从右边推一个元素出来
rpop list
xiaoming
127.0.0.1:6379> lrange list 0 -1
zhangsan
lisi
wangwu
127.0.0.1:6379> lpop list  # 从左边推一个元素出来
zhangsan
127.0.0.1:6379> lrange list 0 -1
lisi
wangwu

2.3 set(集合)

集合中的元素没有先后顺序,hashmap就是基于hashmap来实现的,hashset其实就是一个集合,里面的元素是无序的,他里面的元素不能重复。

命令总结:

sadd set a b c d 添加元素

scard set 获取集合的长度

sismember set a 判断某一个元素是不是在集合里面

smembers set 获取集合中的数据是无序的

srem set a 删除集合中的某一个元素,可以传入多个

sdiff set1 set2 差集

sinter set1 set2 交集

sunion set1 set2 并集

spop order 随机移除一个元素

Go 复制代码
127.0.0.1:6379> sadd set a b c d # 添加元素
4
127.0.0.1:6379> sadd set a b c e  # 实际只有一个元素添加进去了
1
127.0.0.1:6379> scard set  # 获取集合的长度
5
127.0.0.1:6379> sismember set a # 判断某个元素是不是在集合里面
1
127.0.0.1:6379> sismember set f
0
127.0.0.1:6379> smembers set # 获取集合中的数据 无序的
e
d
b
a
c
127.0.0.1:6379> srem set a # 删除集合中的某个元素 可传多个
1

交集,并集和差集:

sdiff 差集

sinter 交集

sunion 并集

Go 复制代码
127.0.0.1:6379> sadd set1 1 2 3
3
127.0.0.1:6379> sadd set2 2 3 4
3
127.0.0.1:6379> sdiff set1 set2   # 差集
1
127.0.0.1:6379> sdiff set2 set1
4
127.0.0.1:6379> sinter set1 set2 # 交集
2
3
127.0.0.1:6379> sunion set1 set2  # 并集
1
2
3
4

随机抽奖,使用 spop 命令用于移除集合中的指定 key 的一个或者多个随机元素,移除后会返回移除的元素。

Go 复制代码
127.0.0.1:6379> sadd order 1 2 3 4 5 6 7 8
8
127.0.0.1:6379> spop order # 随机移除一个
5 # 随机的
127.0.0.1:6379> spop order
7
127.0.0.1:6379> spop order 3 # 随机移除3个  3.2版本才有效 redis-server -v 查看版本 或者
7

2.4 hash(哈希)

相当于 go 里面的 map,python 中的字典

注意:设置过期只能给 hash 的 key 设置过期,里面的键值对是不能单独再设置过期的时间
命令总结:

hset dict name fengfeng 设置一个hash key,并且给hash里面设置一组filed value

hget dict name 获取hash里面对应的filed的值

hgetall dict 数据量大的时候,谨慎使用!!!

获取在哈希表中指定key的所有字段和值

hkeys dict 获取在哈希表中指定key的所有filed

hmset info name fengfeng age 23 批量设置

hexists info name 判断某一个 key 是否存在

hdel info name 删除hash中的一个filed

hlen info 返回hash中的filed的个数

Go 复制代码
127.0.0.1:6379> hset dict name fengfeng  # 设置一个hash key,并且给hash里面设置一组filed value
0
127.0.0.1:6379> hget dict name  # 获取hash里面对应filed的值
fengfeng
127.0.0.1:6379> hgetall dict # 数据量大时,谨慎使用!获取在哈希表中指定 key 的所有字段和值
name
fengfeng
127.0.0.1:6379> hkeys dict # 获取在哈希表中指定 key 的所有filed
name
127.0.0.1:6379> hmset info name fengfeng age 23  # 批量设置
OK
127.0.0.1:6379> hkeys info
name
age
127.0.0.1:6379> HEXISTS info name  # 判断某个key是否存在
1
127.0.0.1:6379> HEXISTS info name1
0
127.0.0.1:6379> HDEL info name  # 删除hash中的一个filed
1
127.0.0.1:6379> hkeys info
age
127.0.0.1:6379> hlen info  # 返回hash中filed的个数
1

2.5 zset(有序集合)

有序集合,sorted set 增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序的排列,也是不能重复的。

cpp 复制代码
127.0.0.1:6379> zadd class 88 fengfeng 46 zhangsan 76 wangwu 36 lisi  # 向有序集合添加一个或多个成员
(integer) 4
127.0.0.1:6379> zrange class 0 -1  # 通过索引,按照分数从低到高返回
1) "lisi"
2) "zhangsan"
3) "wangwu"
4) "fengfeng"
127.0.0.1:6379> zrevrange class 0 -1  # 通过索引,按照分数从高到低返回
1) "fengfeng"
2) "wangwu"
3) "zhangsan"
4) "lisi"
127.0.0.1:6379> zcard class  # 获取有序集合的成员数
(integer) 4
127.0.0.1:6379> ZSCORE class zhangsan # 查看某个成员的分数
"46"
127.0.0.1:6379> ZRANK class wangwu # 查看成员的排名 从小到大排序
(integer) 2
127.0.0.1:6379> ZREVRANK class wangwu # 查看成员的排名 从大到小排序
(integer) 1
127.0.0.1:6379> zcount class 40 70 # 计算在有序集合中指定区间分数的成员数
(integer) 1
127.0.0.1:6379> zrangebyscore class 40 70  # 通过分数返回有序集合指定区间内的成员
1) "zhangsan"
127.0.0.1:6379> zrevrangebyscore class 100 0 # 返回有序集中指定分数区间内的成员,分数从高到低排序
1) "fengfeng"
2) "wangwu"
3) "zhangsan"
4) "lisi"
127.0.0.1:6379> zrange class 0 -1 withscores  # 把成员和分数一起显示出来
1) "lisi"
2) "36"
3) "zhangsan"
4) "46"
5) "wangwu"
6) "76"
7) "fengfeng"
8) "88"
127.0.0.1:6379> zrem class fengfeng  # 移除一个成员
(integer) 1
127.0.0.1:6379> zrange class 0 -1
1) "lisi"
2) "zhangsan"
3) "wangwu"
127.0.0.1:6379> ZREMRANGEBYRANK class 0 0  # 移除有序集合中给定的排名区间的所有成员(第一名是0)(低到高排序) 现在是把lisi移除了 
(integer) 1
127.0.0.1:6379> zrange class 0 -1
1) "zhangsan"
2) "wangwu"
127.0.0.1:6379> ZREMRANGEBYSCORE class 40 50 # 移除有序集合中给定的分数区间的所有成员
(integer) 1
127.0.0.1:6379> zrange class 0 -1
1) "wangwu"
127.0.0.1:6379> ZSCORE class wangwu
"76"
127.0.0.1:6379> ZINCRBY class 2 wangwu  # 给王五+2
"78"
127.0.0.1:6379> ZINCRBY class -2 wangwu # 给王五-2
"76"
127.0.0.1:6379> ZSCORE class wangwu
"76"

三、通过 go 操作五大数据类型

四、redis 常用的命令

五、事务

六、锁

七、持久化

相关推荐
惊起白鸽45017 分钟前
MySQL全量,增量备份与恢复
数据库·mysql
暮雨疏桐1 小时前
MySQL SQL Mode及其说明
数据库·sql·mysql·sql mode
Tangcan-1 小时前
【MySQL】数据库基础
数据库·mysql
蔡蓝2 小时前
Mysql的索引,慢查询和数据库表的设计以及乐观锁和悲观锁
数据库·mysql
jstart千语2 小时前
【Redis】分布式锁的实现
数据库·redis·分布式
亚林瓜子2 小时前
AWS EC2源代码安装valkey命令行客户端
redis·云计算·aws·cli·valkey
一把年纪学编程3 小时前
【牛马技巧】word统计每一段的字数接近“字数统计”
前端·数据库·word
极小狐3 小时前
极狐GitLab 通用软件包存储库功能介绍
java·数据库·c#·gitlab·maven
钢铁男儿3 小时前
C# 方法(可选参数)
数据库·mysql·c#
?abc!3 小时前
缓存(5):常见 缓存数据淘汰算法/缓存清空策略
java·算法·缓存