0%

Redis入门

Docker 安装 Redis

docker pull redis:latest
取最新版的 Redis 镜像

docker images
查看是否已安装了 redis

运行 redis 容器
docker run -itd --name redis-test -p 6379:6379 redis
或者运行redis并设置密码
docker run -d --name myredis -p 6379:6379 redis --requirepass "mypassword"

其中-p 6379:6379:映射容器服务的 6379 端口到宿主机的 6379 端口。外部可以直接通过宿主机ip:6379 访问到 Redis 的服务。

docker ps 查看容器的运行信息

1
2
3
4
➜  Desktop docker ps 
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d1f67d1e5fda redis "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:6379->6379/tcp redis-test
0eee2c1708be mysql:5.7 "docker-entrypoint.s…" 8 hours ago Up 8 hours 0.0.0.0:3306->3306/tcp, 33060/tcp happy_chandrasekhar

最后,通过过 redis-cli 连接测试使用 redis 服务

1
2
3
4
5
➜  Desktop docker exec -it redis-test /bin/bash
root@d1f67d1e5fda:/data# redis-cli
127.0.0.1:6379> set test 1
OK
127.0.0.1:6379>

数据类型

数据类型 可以存储的值 操作
STRING 字符串、整数或者浮点数 对整个字符串或者字符串的其中一部分执行操作;对整数和浮点数执行自增或者自减操作;
LIST 列表 从两端压入或者弹出元素;读取单个或者多个元素;进行修剪,只保留一个范围内的元素;
SET 无序集合 添加、获取、移除单个元素;检查一个元素是否存在于集合中;计算交集、并集、差集;从集合里面随机获取元素;
HASH 包含键值对的无序散列表 添加、获取、删除单个键值对;获取所有键值对;检查某个健是否存在;
ZSET 有序集合 添加、获取、删除元素;根据分值范围或者成员来获取元素;计算一个键的排名;

STRING

命令 行为
GET 获取存储在给定健中的值
SET 设置存储在给定健中的值
DEL 删除存储在给定健中的值(这个命令可以用于所有类型)
1
2
3
4
5
6
7
8
9
127.0.0.1:6379> set name longshan
OK
127.0.0.1:6379> get name
"longshan"
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379>

LIST

命令 行为
rpush 获取存储在给定键中的值
lrange 设置存储在给定键中的值
lindex 删除存储在给定键中的值(这个命令可以用于所有类型)
lpop 删除存储在给定键中的值(这个命令可以用于所有类型)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
127.0.0.1:6379> lrange list 0-1
(error) ERR wrong number of arguments for 'lrange' command
127.0.0.1:6379> lrange list 0 -1
1) "item1"
2) "item2"
3) "item3"
127.0.0.1:6379> lrange list 1
(error) ERR wrong number of arguments for 'lrange' command
127.0.0.1:6379> lindex list 1
"item2"
127.0.0.1:6379> lpop list
"item1"
127.0.0.1:6379> lrange list 0 -1
1) "item2"
2) "item3"
127.0.0.1:6379>

SET

命令 | 行为
-|-|-
sadd | 添加一个或多个元素到集合里
smembers | 获取集合里面的所有元素
sismember | 确定一个给定的值是一个集合的成员
srem | 从集合里删除一个或多个元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
127.0.0.1:6379> sadd set item1
(integer) 1
127.0.0.1:6379> sadd set item2
(integer) 1
127.0.0.1:6379> sadd set item3
(integer) 1
127.0.0.1:6379> sadd set item3
(integer) 0
127.0.0.1:6379> smember set
(error) ERR unknown command `smember`, with args beginning with: `set`,
127.0.0.1:6379> smembers set
1) "item3"
2) "item1"
3) "item2"
127.0.0.1:6379> sismember set item5
(integer) 0
127.0.0.1:6379> srem set item2
(integer) 1
127.0.0.1:6379> srem set item2
(integer) 0
127.0.0.1:6379> smenbers set
(error) ERR unknown command `smenbers`, with args beginning with: `set`,
127.0.0.1:6379> smembers set
1) "item3"
2) "item1"
127.0.0.1:6379>

HASH

命令 | 行为
-|-|-
hset | 设置 hash 里面一个字段的值
hget | 获取 hash 中域的值
hgetall | 从 hash 中读取全部的域和值
hdel | 删除一个或多个域

ZSET

命令 | 行为
-|-|-
ZADD | 添加到有序 set 的一个或多个成员,或更新的分数,如果它已经存在
ZRANGE | 根据指定的 index 返回,返回 sorted set 的成员列表
ZRANGEBYSCORE | 返回有序集合中指定分数区间内的成员,分数由低到高排序。
ZREM | 从排序的集合中删除一个或多个成员

使用场景

  • 缓存 - 将热点数据放到内存中,设置内存的最大使用量以及过期淘汰策略来保证缓存的命中率。

  • 计数器 - Redis 这种内存数据库能支持计数器频繁的读写操作。

  • 应用限流 - 限制一个网站访问流量。

  • 消息队列 - 使用 List 数据类型,它是双向链表。

  • 查找表 - 使用 HASH 数据类型。

  • 交集运算 - 使用 SET 类型,例如求两个用户的共同好友。

  • 排行榜 - 使用 ZSET 数据类型。

  • 分布式 Session - 多个应用服务器的 Session 都存储到 Redis 中来保证 Session 的一致性。

  • 分布式锁 - 除了可以使用 SETNX 实现分布式锁之外,还可以使用官方提供的 RedLock 分布式锁实现。

通过go语言使用Redis

1.设置一下Redis密码然后测试连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
➜  egoshop docker rm -f cd93e4361dff                                                 
cd93e4361dff

➜ egoshop docker run -d --name myredis -p 6379:6379 redis --requirepass "mypassword"
f21ed92618bc5a48a95a05fcf73d1fb911b3020616dfd4950b4827dc9559814e
➜ egoshop docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f21ed92618bc redis "docker-entrypoint.s…" 3 seconds ago Up 1 second 0.0.0.0:6379->6379/tcp myredis
0eee2c1708be mysql:5.7 "docker-entrypoint.s…" 10 hours ago Up 10 hours 0.0.0.0:3306->3306/tcp, 33060/tcp happy_chandrasekhar
➜ egoshop docker exec -it myredis /bin/bash
root@f21ed92618bc:/data# redis-cli
127.0.0.1:6379> auth "mypassword"
OK
127.0.0.1:6379>

2.创建连接池

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
func newRedisPool() *redis.Pool {
return &redis.Pool{
MaxIdle: 50,
MaxActive: 30,
IdleTimeout: 300 * time.Second,
Dial: func() (redis.Conn, error) {
// 1. 打开连接
c, err := redis.Dial("tcp", redisHost)
if err != nil {
fmt.Println(err)
return nil, err
}

// 2. 访问认证
if _, err = c.Do("AUTH", redisPass); err != nil {
c.Close()
return nil, err
}
return c, nil
},
TestOnBorrow: func(conn redis.Conn, t time.Time) error {
if time.Since(t) < time.Minute {
return nil
}
_, err := conn.Do("PING")
return err
},
}
}

func init() {
pool = newRedisPool()
}

func RedisPool() *redis.Pool {
return pool
}

3.添加数据

1
2
3
4
5
6
7
8
func UploadHandler() {
// 获得redis的一个连接
rConn := rPool.RedisPool().Get()
defer rConn.Close()

// 将初信息写入到redis缓存
rConn.Do("sadd", "set", "uploadHandler")
}

4.查看是否有添加数据

1
2
3
127.0.0.1:6379> smembers set
1) "upload1"
2) "uploadHandler"

具体demo源码

参考资料
Redis 简介
Docker 安装 Redis
Redis 入门指南