这是我参与8月更文挑战的第23天,活动详情查看:8月更文挑战
redis
redis是一种NoSQL数据库, key-value存储方式. 数据都保存在内存中, 也称为缓存型数据库或内存型数据库.
redis是用C语言编写的开源的数据. 一般和MySQL配合使用, 用于一些数据的缓存, 来缓解MySQL数据库的压力.
特性
- 支持持久化. 可以定时将内存中的数据保存到硬盘中, 启动redis的时候, 再从硬盘中将数据读入内存
- redis不单单支持string类型的数据, 还支持hash, list, set, zset五种类型的数据
- redis支持数据的备份
应用场景
常用用于数据缓存
session共享
购物车功能
队列系统等场景
安装redis数据库
brew install redis
安装go-redis代码库
go get -u github.com/go-redis/redis
set操作
将一条数据加入redis, key为字符串类型, value为空接口类型, expiration为过期时间, 如果为0则代表这个key存储的数据永不过期, 返回值StatusCmd存储了命令的执行结果
func (c *cmdable) Set(key string, value interface{}, expiration time.Duration) *StatusCmd
func setData() {
// 存储姓名
err := cli.Set("name", "shaosiming", 0).Err()
if err != nil {
fmt.Println(" redis set name failed: ", err)
return
}
fmt.Println("redis set name succeed!")
// 存储年龄
err = cli.Set("age", 18, 0).Err()
if err != nil {
fmt.Println(" redis set age failed: ", err)
return
}
fmt.Println("redis set age succeed!")
}
appen操作
向redis中key所对应的value值拼接数据. 如果key存在, 则将value值追加到value上. 如果key不存在, 则创建一条数据存入redis
func (c *cmdable) Append(key, value string) *IntCmd
func appendData() {
// 追加值
n, err := cli.Append("addr", "16号").Result()
if err != nil {
fmt.Println("redis append failed: ", err)
return
}
fmt.Println("redis append succeed! - ", n)
res, err := cli.Get("addr").Result()
if err != nil {
fmt.Println("redis get addr failed: ", err)
return
}
fmt.Println("redis get addr succeed! - ", res)
}
get操作
通完key获取value. 如果key不存在, 返回nil
func (c *cmdable) Get(key string) *StringCmd
func getData() {
// 获取姓名
res, err := cli.Get("name").Result()
if err != nil {
fmt.Println("redis get name failed: ", err)
return
}
fmt.Println("redis get name succeed!")
// 输出数据
fmt.Println(res)
// 获取年龄
res, err = cli.Get("age").Result()
if err != nil {
fmt.Println("redis get age failed: ", err)
return
}
fmt.Println("redis get age succeed!")
// 输出数据
fmt.Println(res)
}
mset操作
一次向redis中添加多个键值, 参数为k1, v1, k2, v2, ...
func (c *cmdable) MSet(pairs ...interface{}) *StatusCmd
func msetData() {
err := cli.MSet("name", "tianming", "age", 18, "addr", "class first").Err()
if err != nil {
fmt.Println("redis mset failed: ", err)
return
}
fmt.Println("redis mset succeed!")
}
mget操作
一次从redis中获取多个值, 参数为: k1, k2, ...
func (c *cmdable) MGet(keys ...string) *SliceCmd
func mgetData() {
s, err := cli.MGet("name", "age", "addr").Result()
if err != nil {
fmt.Println("redis mget failed: ", err)
return
}
fmt.Println("redis mget succeed!")
// 遍历数据
for _, o := range s {
fmt.Println(o)
}
}
keys操作
通过正则表达式的方式redis中获取key, 比如通过*获取所有的key
func (c *cmdable) Keys(pattern string) *StringSliceCmd
func keysData() {
keys, err := cli.Keys("*").Result()
if err != nil {
fmt.Println("get all keys failed: ", err)
return
}
fmt.Println("get all keys succeed!")
for i, key := range keys {
fmt.Println(i, ": ", key)
}
}
exists操作
判断key是否存在, 存在返回1, 不存在返回0
func (c *cmdable) Exists(keys ...string) *IntCmd
func existsData() {
ret, err := cli.Exists("name").Result()
if err != nil {
fmt.Println("redis exists failed: ", err)
return
}
fmt.Println("key name isExists: ", ret)
ret, err = cli.Exists("gender").Result()
if err != nil {
fmt.Println("redis exists failed: ", err)
return
}
fmt.Println("key gender isExists: ", ret)
}
expire操作
设置key的过期时间, 过期时间为time.Duration类型,
func (c *cmdable) Expire(key string, expiration time.Duration) *BoolCmd
获取key还剩多长时间过期
func (c *cmdable) TTL(key string) *DurationCmd
func expireData() {
err := cli.Set("tel", "18612344321", 0).Err()
if err != nil {
fmt.Println("redis set failed: ", err)
}
ret, err := cli.Expire("tel", time.Second * 20).Result()
if err != nil {
fmt.Println(" redis Expire failed: ", err)
return
}
fmt.Println("redis Expire isSuccess: ", ret)
td, err := cli.TTL("tel").Result()
if err != nil {
fmt.Println(" redis TTL failed: ", err)
return
}
fmt.Println("key tel TTL: ", td)
}