首页 > 数据库 >Redis基础数据结构

Redis基础数据结构

时间:2023-04-13 18:37:59浏览次数:36  
标签:127.0 nil err 0.1 Redis 基础 6379 数据结构 panic

五种基础数据结构: string(字符串)、list(列表)、set(集合)、hash(集合)和set(有序集合)

使用命令redis-cli即可连接

使用go语言代码连接redis:

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

var c *redis.Client

func main() {
	c = redis.NewClient(&redis.Options{
		Addr:     "localhost:6379",
		Password: "",
		DB:       0,
	})
	s, err := c.Ping().Result()
	if err != nil {
		panic(err)
	}
	println(s)
}

string字符串

redis中最简单的数据结构,redis所有的数据结构都是以唯一的key字符串作为名称,然后通过唯一key值来获取相应的value数据,不同类型的数据结构的差异就在于value结构不同,redis的字符串是动态字符串,是可以修改的字符串,采用预分配冗余空间的方法来减少内存的频繁分配。

批量键值对:

127.0.0.1:6379> set name test
OK
127.0.0.1:6379> get name
"test"
127.0.0.1:6379> set name1 test1
OK
127.0.0.1:6379> set name2 test2
OK
127.0.0.1:6379> set name3 test3
OK
127.0.0.1:6379> mget name1 name2 name3
1) "test1"
2) "test2"
3) "test3"

go示例代码:

err = c.Set("key", "value", 0).Err() // set key value
if err != nil {
    panic(err)
}

val, err := c.Get("key").Result() // get key value
if err != nil {
    panic(err)
}

// mset ....
err = c.MSet("key1", "value1", "key2", "value2", "key3", "value3").Err()
if err != nil {
    panic(err)
}

// mget ....
vals, err := c.MGet("key1", "key2", "key3").Result()
if err != nil {
    panic(err)
}
for _, val := range vals {
    println(val.(string))
}

过期策略,对key设置过期时间,到点自动删除,用于控制缓存失效时间

127.0.0.1:6379> expire name 5
(integer) 1
127.0.0.1:6379> get name
"test"
127.0.0.1:6379> get name
(nil)

go示例代码:

err = c.Expire("key",5).Err()
if err != nil {
    panic(err)
}

计数,value是一个整数,可以对其进行自增操作,自增有范围,是signed long的最大最小值

127.0.0.1:6379> set age 30
OK
127.0.0.1:6379> incr age
(integer) 31
127.0.0.1:6379> get age
"31"
127.0.0.1:6379> incrby age -10
(integer) 21
127.0.0.1:6379> get age
"21"

go示例代码:

err = c.Set("num", 1, 0).Err()
if err != nil {
    panic(err)
}
val, err := c.Incr("num").Result()
if err != nil {
    panic(err)
}
println(val)

val, err = c.IncrBy("num", 2).Result()
if err != nil {
    panic(err)
}
println(val)

list列表

redis中列表相当于链表,插入和删除操作快,索引定位快,通常作为异步队列来使用

右进右出:栈

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

右进左出:队列

127.0.0.1:6379> rpush values python java golang
(integer) 3
127.0.0.1:6379> lpop values
"python"
127.0.0.1:6379> lpop values
"java"
127.0.0.1:6379> lpop values
"golang"

go示例代码:

err = c.LPush("nums", 1, 2, 3, 4, 5, 6).Err() // RPush同理
if err != nil {
    panic(err)
}
val, err := c.RPop("nums").Result() // LPop同理
if err != nil {
    panic(err)
}
println(val)

使用慢操作

lindex,对链表进行遍历,可以为负数,表示倒数

ltrim,使用两个参数定义一个区间,仅保留该区间里的值,以此来实现一个定长的链表

127.0.0.1:6379> rpush values python java golang
(integer) 3
127.0.0.1:6379> lindex values 1
"java"
127.0.0.1:6379> lrange values 0 -1
1) "python"
2) "java"
3) "golang"
127.0.0.1:6379> ltrim values 1 -1
OK
127.0.0.1:6379> lrange values 0 -1
1) "java"
2) "golang"

go示例代码:

n, err := c.LLen("nums").Result() // llen
if err != nil {
    panic(err)
}
println(n)

vals, err := c.LRange("nums", 0, -1).Result() // lrange
if err != nil {
    panic(err)
}
fmt.Printf("%v\n", vals)

dels, err := c.LRem("nums", 1, 2).Result() // 删除2
if err != nil {
    panic(err)
}
println(dels)

val, err := c.LIndex("nums", 4).Result() // 根据索引坐标 查询列中数据
if err != nil {
    panic(err)
}
println(val)

// 在5之前插入4
err = c.LInsert("nums", "before", 5, 4).Err()
if err != nil {
    panic(err)
}

// 在5之后插入4
err = c.LInsert("after", "after", 5, 4).Err()
if err != nil {
    panic(err)
}

Hash字典

redis的字典采用了渐进式rehash,会在rehash时,保留新旧两个hash结构,同时查询两个hash结构,再后续的定时任务中以及hash操作指令中,循序渐进将旧hash的内容一点点迁移到新hash中,搬迁成功后,就完全用新hash代替旧hash

127.0.0.1:6379> hset keys key1 "value1"
(integer) 0
127.0.0.1:6379> hset keys key2 "value2"
(integer) 1
127.0.0.1:6379> hset keys key3 "value3"
(integer) 1
127.0.0.1:6379> hgetall keys
1) "key1"
2) "value1"
3) "key2"
4) "value2"
5) "key3"
6) "value3"
127.0.0.1:6379> hget keys key1
"value1"
127.0.0.1:6379> hget keys key2
"value2"
127.0.0.1:6379> hget keys key3
"value3"

go示例代码:

c.HSet("keys", "key1", "value1")
c.HSet("keys", "key2", "value2")
c.HSet("keys", "key3", "value3")

val, err := c.HGet("keys", "key1").Result()
if err != nil {
    panic(err)
}
println(val)

// 输出
data, err := c.HGetAll("keys").Result()
if err != nil {
    panic(err)
}
for field, val := range data {
    println(field, val)
}

Zset有序集合

是一个set,内部value是唯一的,又给每一个value赋予一个score,代表value的权重,内部排序使用跳表来实现

127.0.0.1:6379> zadd langs 9.0 "java"
(integer) 1
127.0.0.1:6379> zadd langs 8.0 "python"
(integer) 1
127.0.0.1:6379> zadd langs 8.5 "golang"
(integer) 1
127.0.0.1:6379> zrange langs 0 -1
1) "python"
2) "golang"
3) "java"
127.0.0.1:6379> zcard langs
(integer) 3
127.0.0.1:6379> zscore langs "java"
"9"
127.0.0.1:6379> zrangebyscore langs 0 8
1) "python"
127.0.0.1:6379> zrangebyscore langs 0 8 withscores
1) "python"
2) "8"
127.0.0.1:6379> zrem langs "java"
(integer) 1
127.0.0.1:6379> zrange langs 0 -1
1) "python"
2) "golang"

对应go代码:

c.ZAdd("keys", redis.Z{Score: 2.5, Member: "score1"},
    redis.Z{Score: 5, Member: "score2"})

count, err := c.ZCard("keys").Result()
if err != nil {
    panic(err)
}
println(count)

elems, err := c.ZRange("keys", 0, -1).Result()
if err != nil {
    panic(err)
}
for _, elem := range elems {
    fmt.Printf("%v\n", elem)
}

score, err := c.ZScore("keys", "score1").Result()
if err != nil {
    panic(err)
}
println(score)

c.ZRem("keys", "score1")
elems, err = c.ZRange("keys", 0, -1).Result()
if err != nil {
    panic(err)
}
for _, elem := range elems {
    fmt.Printf("%v\n", elem)
}

标签:127.0,nil,err,0.1,Redis,基础,6379,数据结构,panic
From: https://www.cnblogs.com/N3ptune/p/17315965.html

相关文章

  • 关于前端基础数据结构的问题
    常用的数据集采用数组的好处,当然对于前端新人来很容易混淆,如下的数据是数组(js的数组本就是特殊的对象,因此又叫数组对象)由于这缘故很多网上的叫法五花八门所以下面的数据结构很容易混淆,以为这是数组对象(其实这样叫没错,只是理解成是真对象(js的数组也是对象的一种,先区别一下免得混淆......
  • redis-4-2,使用docker在同一台服务器配置redis主从复制
    拉取redis镜像dockerpullredis下载redis配置文件https://redis.io/docs/management/config/在这里面找到需要的版本的配置文件使用配置文件的时候可能会出错,从docker拉取下来的最新镜像是6.2.8版本的......
  • 基于mpc的日前日内微网共享储能优化调度 日前优化部分——该程序首先根据《
    基于mpc的日前日内微网共享储能优化调度日前优化部分——该程序首先根据《电力系统云储能研究框架与基础模型》上面类似方法,首先根据每个居民的实际需要得到响应储能充放电功率,然后优化得到整体的储能充放电功率情况。日内滚动mpc跟踪部分——采用《基于MPC的微电网并网优化调度......
  • springboot学习之三(整个redis)
     springboot整合redis1.依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>2.配置#Redis配置spring.r......
  • 【web 开发基础】PHP 中的特殊流程控制(continue) -PHP 快速入门 (21)
    continue语句continue语句只能用于循环语句内部,功能是跳过本次循环继续执行下一次循环结构,而不终止整个循环的执行。在while和do...while语句中,continue语句跳转到循环条件处开始继续执行,对于for循环随后的动作是变量更新。流程图如下:continue的语法如下:continue[label];可选的......
  • 七天玩转Redis |第二天打卡 学习Redis的基本数据类型
    今天学习的内容是Redis的五种数据类型今天的收获是Redis与我们常用的数据库不同,数据类型只有五种String、Hash、List、Set、ZSet。这五种类型比较陌生的应该是ZSet类型、ZSet类型既有Set类型的值唯一,也有List类型的值有序排列。这五种类型我用的最多的是String、List、Hash......
  • 七天玩转Redis | 打卡第三天 使用Redis的地理位置、基数统计、位图场景
    今天学习的内容今天学习了Redis在地理位置、基数统计、位图场景上的使用今天的收获今天的收获,了解了Redis在另外几个场景下的应用,比如说地理位置长的应用,在以前我只知道用一些特殊的api来计算距离,没想到Redis还提供这样的服务,这样可以省去调用一些api来计算,可以直接将要计......
  • 七天玩转Redis | 打卡第1天 连接Redis基础命令
    今天学习的内容是了解Redis的安装以及简单常用命令今天的收获Redis是一常见的非关系性数据库,入门Redis是比较简单的,因为Redis的基础命令比较简单,比如说setkeyvalue这个命令是往Redis里面插入数据用的,采用的形式是键值对形式,学习过java的小伙伴都应该非常连接这种存值方......
  • 【0基础学爬虫】爬虫基础之数据存储
    大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章,为实现从易到难全方位覆盖,特设【0基础学爬虫】专栏,帮助小白快速入门爬虫,本期为数据存储。概述上期我们介绍到了文件......
  • c语言基础
    目录1、初识C语言1.1、第一个C语言程序1.2、变量与常量1.3、数据类型1.4、关键字2、分支与循环2.1、分支结构2.2、循环结构3、数组3.1、定义3.2、使用4、指针4.1、定义4.2、大小4.3、使用5、函数5.1、定义5.2、函数的分类5.3、形参与实参5.4、......