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 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 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 入门指南