# README
devcloud-go/redis
Introduction
Currently, the Redis supports three modes.single-read-write,local-read-single-write and double-write
single-read-write
local-read-single-write
double-write
Quickstart:
- use yaml configuartion file
package main
import (
"context"
"time"
"github.com/huaweicloud/devcloud-go/redis"
)
func main() {
ctx := context.Background()
client := redis.NewDevsporeClientWithYaml("./config_with_password.yaml")
client.Set(ctx, "test_key", "test_val", time.Hour)
client.Get(ctx, "test_key")
}
- use code(recommend)
package main
import (
"context"
"time"
goredis "github.com/go-redis/redis/v8"
"github.com/huaweicloud/devcloud-go/redis"
"github.com/huaweicloud/devcloud-go/redis/config"
)
func main() {
servers := map[string]*config.ServerConfiguration{
"server1": {
Hosts: "127.0.0.0:6379",
Password: "XXXX",
Type: config.ServerTypeNormal,
Cloud: "huawei cloud",
Region: "beijing",
Azs: "az0",
},
}
configuration := &config.Configuration{
RedisConfig: &config.RedisConfiguration{
Servers: servers,
},
RouteAlgorithm: "single-read-write",
Active: "server1",
}
client := redis.NewDevsporeClient(configuration)
ctx := context.Background()
client.Set(ctx, "test_key", "test_val", time.Hour)
client.Get(ctx, "test_key")
}
Yaml configuration file
props:
version: v1
appId: xxx
monitorId: sdk_test
cloud: huaweicloud
region: cn-north-4
azs: az1
etcd: # Optional
address: 127.0.0.1:2379,127.0.0.2:2379,127.0.0.3:2379
apiVersion: v3
username: XXXX
password: XXXX
httpsEnable: false
redis:
redisGroupName: xxx-redis-group
username: xxx # for redis 6.0
password: yyy
nearest: dc1
connectionPool:
enable: true
servers:
dc1:
hosts: 127.0.0.1:6379
password: password
type: normal # cluster, master-slave, normal
cloud: huaweicloud # cloud
region: cn-north-4 # region id
azs: az1 # azs
pool: # Optional
maxTotal: 100
maxIdle: 8
minIdle: 0
maxWaitMillis: 10000
timeBetweenEvictionRunsMillis: 1000
dc2:
hosts: 127.0.0.1:6380
password: password
type: master-slave # cluster, master-slave, normal
cloud: huaweicloud # cloud
region: cn-north-4 # region id
azs: az1 # azs
pool: # Optional
maxTotal: 100
maxIdle: 8
minIdle: 0
maxWaitMillis: 10000
timeBetweenEvictionRunsMillis: 1000
routeAlgorithm: single-read-write # local-read-single-write, single-read-write, double-write
active: dc1
Double-write
Redis also supports double-write modes, including memory double-write and file double-write, depending on asyncRemotePool.persist. true: file double-write; false: memory double-write
redis:
redisGroupName: xxx-redis-group
username: xxx # for redis 6.0
password: yyy
nearest: dc1
asyncRemoteWrite:
retryTimes: 4
connectionPool:
enable: true
asyncRemotePool:
persist: true
threadCoreSize: 10
taskQueueSize: 5
persistDir: dataDir/
servers:
dc1:
hosts: 127.0.0.1:6379
password:
type: normal # cluster, master-slave, normal
cloud: huaweicloud # cloud
region: cn-north-4 # region id
azs: az1 # azs
pool: # Optional
maxTotal: 100
maxIdle: 8
minIdle: 0
maxWaitMillis: 10000
timeBetweenEvictionRunsMillis: 1000
dc2:
hosts: 127.0.0.1:6380
password:
type: normal # cluster, master-slave, normal
cloud: huaweicloud # cloud
region: cn-north-4 # region id
azs: az1 # azs
pool: # Optional
maxTotal: 100
maxIdle: 8
minIdle: 0
maxWaitMillis: 10000
timeBetweenEvictionRunsMillis: 1000
routeAlgorithm: double-write # local-read-single-write, single-read-write, double-write
active: dc2
Fault injection
Redis also supports the creation of services with fault injection. The configuration is similar to that of MySQL.
func DCRedis(etcdAddrs, redisAddrs []string) *redisconfig.Configuration {
servers := make(map[string]*redisconfig.ServerConfiguration)
for i, addr := range redisAddrs {
stri := strconv.Itoa(i + 1)
servers["ds"+stri] = &redisconfig.ServerConfiguration{
Hosts: addr,
Password: "XXXX",
Type: redisconfig.ServerTypeNormal,
Cloud: "huawei cloud",
Region: "beijing",
Azs: "az1",
}
}
configuration := &redisconfig.Configuration{
RedisConfig: &redisconfig.RedisConfiguration{
Servers: servers,
},
RouteAlgorithm: "single-read-write",
Active: "ds1",
Chaos: &mas.InjectionProperties{
Active: true,
Duration: 50,
Interval: 100,
Percentage: 100,
DelayInjection: &mas.DelayInjection{
Active: true,
Percentage: 100,
TimeMs: 1000,
JitterMs: 500,
},
ErrorInjection: &mas.ErrorInjection{
Active: true,
Percentage: 30,
},
},
}
return configuration
}
Alternatively, add the following configuration to the configuration file:
chaos:
active: true
duration: 50
interval: 100
percentage: 100
delayInjection:
active: true
percentage: 100
timeMs: 1000
jitterMs: 500
errorInjection:
active: true
percentage: 20
Testing
package commands_test needs redis 6.2.0+, so if your redis is redis 5.0+, you need to execute
ginkgo -skip="redis6"
See more usages of ginkgo in https://github.com/onsi/ginkgo
Description of Configuration Parameters
ConfigurationParameter Name | Parameter Type | Value range | Description |
---|---|---|---|
props | PropertiesConfiguration | For details,see the description of the data structure of PropertiesConfiguration | Mas monitoring configuration,which is used together with etcd |
etcd | EtcdConfiguration | For details,see the description of the data structure of EtcdConfiguration | Etcd configuration.If it is configured, it will be pulled from the remote end |
redis | RedisConfiguration | For details,see the description of the data structure of RedisConfiguration | RedisServer configuration |
routeAlgorithm | string | single-read-write,local-read-single-write,double-write | Routing algorithm |
active | string | The value can only be dc1 or dc2 | Activated Redis |
chaos | InjectionProperties | For details,see the description of the data structure of InjectionProperties | Fault Injection Configuration |
Parameter Name | Parameter Type | Value range | Description |
---|---|---|---|
version | string | - | Project version number |
appId | string | - | Project name |
monitorId | string | - | Monitoring group name |
cloud | string | - | Project deployment cloud group |
region | string | - | Project deployment region |
azs | string | - | Project deployment AZ |
Parameter Name | Parameter Type | Value range | Description |
---|---|---|---|
address | string | - | Etcd address |
apiVersion | string | - | Etcd interface Version |
username | string | - | Etcd username |
password | string | - | Etcd password |
httpEnable | bool | - | Specifies whether HTTPS is enabled for Etcd |
Parameter Name | Parameter Type | Value range | Description |
---|---|---|---|
nearest | string | The value can only be dc1 or dc2 | Indicates the local Redis |
asyncRemoteWrite.retryTimes | int | - | Number of retries of asynchronous remote write operations |
connectionPool.enable | bool | true/false | Indicates whether to enable the connection pool |
asyncRemotePool | AsyncRemotePoolConfiguration | For details,see the description of the data structure of AsyncRemotePoolConfiguration | Configure the asynchronous write thread pool |
servers | map[string]ServerConfiguration | The key is dc1/dc2.for details about a single dimension,see the description of the data structure of ServerConfiguration | RedisServer connection configuration of dc1 and dc2 |
Parameter Name | Parameter Type | Value range | Description |
---|---|---|---|
threadCoreSize | int | - | Basic size of the thread pool |
persist | bool | true/false | Indicates whether the command is persistent.No:The command is fast.Yes:The speed is lower than that of non-persistent |
taskQueueSize | int | - | Number of buffer queues |
persistDir | string | Default root directory "/" | Redis persistent file directory |
Parameter Name | Parameter Type | Value range | Description |
---|---|---|---|
hosts | string | - | RedisServer IP address |
password | string | - | RedisServer password |
type | string | cluster,master-slave,normal | RedisServer Type |
cloud | string | - | RedisServer cloud |
region | string | - | Region to which the RedisServer belongs |
azs | string | - | AZ to which RedisServer belongs |
pool | ServerConnectionPoolConfiguration | For details,see the description of the data structure of ServerConnectionPoolConfiguration | Connection pool configuration |
Parameter Name | Parameter Type | Value range | Description |
---|---|---|---|
maxTotal | int | - | Maximum number of active objects |
maxIdle | int | - | Maximum number of objects that can remain in the idle state |
minIdle | int | - | Minimum number of objects that can remain in the idle state |
maxWaitMillis | int | - | Maximum wait time when no object is returned in the pool |
timeBetweenEvictionRunsMillis | int | - | Idle link detection thread,detection interval,in milliseconds.A negative value indicates that the detection thread is not running |
Parameter Name | Parameter Type | Value range | Description |
---|---|---|---|
active | bool | true/false | Whether the fault injection function is enabled |
duration | int | - | Fault injection duration,in seconds |
interval | int | - | Fault injection interval,in seconds |
percentage | int | 0-100 | Injection failure probability |
delayInjection.active | bool | true/false | Delay injection switch |
delayInjection.percentage | int | 0-100 | Delayed Fault Effective Probability |
delayInjection.timeMs | int | - | Indicates the delay base,in milliseconds |
delayInjection.jitterMs | int | - | Indicates the jitter amplitude of the delay, in milliseconds |
errorInjection.active | bool | true/false | Abnormal injection switch |
errorInjection.percentage | int | 0-100 | Abnormal Fault Effective Probability |
# Packages
No description provided by the author
No description provided by the author
Package config defines a series of devspore redis configuration, include configuration
from yaml and remote etcd.
Package file Double-write of files.
Package strategy defines different route strategy mode.
# Functions
NewDevsporeClient create a devsporeClient with Configuration which will assign etcd remote configuration.
NewDevsporeClientWithYaml create a devsporeClient with yaml configuration.
# Structs
DevsporeClient implements go-redis/UniversalClient interface which defines all redis commands, DevsporeClient includes configuration and a client pool, the pool will store redis client or cluster client.