依赖github.com/hoisie/redis,将golang的结构体(struct)
与redis的hex表做交流

redis是一个以key-value存储的非关系型数据库。有七种数据类型,string、hashes、list、set、zset。

redis-3.2.3安装

import (
    "errors"
    "github.com/hoisie/redis"
    "log"
    "reflect"
    "strconv"

)

//转码到缓存
func Marshal(pro interface{}) (map[string]interface{}, error) {
    val := reflect.ValueOf(pro)
    var ret = map[string]interface{}{}
    val = val.Elem()
    typ := val.Type()
    if typ.Kind() == reflect.Ptr {
        typ = typ.Elem()
    }

    if typ.Kind() != reflect.Struct {
        return nil, errors.New("Is not a Struct!")
    }

    for i := 0; i < typ.NumField(); i++ {

        kind := val.Field(i).Kind()
        name := typ.Field(i).Name
        field := val.Field(i)
        if kind == reflect.String {
            ret[name] = field.String()
        } else if kind == reflect.Int || kind == reflect.Int8 || kind == reflect.Int16 || kind == reflect.Int32 || kind == reflect.Int64 {
            ret[name] = field.Int()
        } else if kind == reflect.Uint || kind == reflect.Uint8 || kind == reflect.Uint16 || kind == reflect.Uint32 || kind == reflect.Uint64 {
            ret[name] = field.Uint()
        } else if kind == reflect.Float32 || kind == reflect.Float64 {
            ret[name] = field.Float()
        } else if kind == reflect.Bool {
            ret[name] = field.Bool()
        }
    }
    return ret, nil
}

//解码到对象
func Unmarshal(client *redis.Client, key string, pro interface{}) error {
    val := reflect.ValueOf(pro)
    if val.Kind() == reflect.Ptr {
        val = val.Elem()
    }
    typ := val.Type()
    if typ.Kind() == reflect.Ptr {
        typ = typ.Elem()
    }
    if typ.Kind() != reflect.Struct {
        return errors.New("Is not a Struct!")
    }

    for i := 0; i < typ.NumField(); i++ {

        kind := val.Field(i).Kind()
        Log.Println(typ.Field(i).Name, kind)
        f := val.FieldByName(typ.Field(i).Name)

        if kind == reflect.String {
            str, _ := client.Hget(key, typ.Field(i).Name)
            f.SetString(string(str))
        } else if kind == reflect.Int || kind == reflect.Int8 || kind == reflect.Int16 || kind == reflect.Int32 || kind == reflect.Int64 {
            str, _ := client.Hget(key, typ.Field(i).Name)
            s, _ := StringToInt(str)
            f.SetInt(s)
        } else if kind == reflect.Uint || kind == reflect.Uint8 || kind == reflect.Uint16 || kind == reflect.Uint32 || kind == reflect.Uint64 {
            str, _ := client.Hget(key, typ.Field(i).Name)
            s, _ := StringToUint(str)
            f.SetUint(s)

        } else if kind == reflect.Float32 || kind == reflect.Float64 {
            str, _ := client.Hget(key, typ.Field(i).Name)
            s, _ := StringToFloat(str)
            f.SetFloat(s)
        } else if kind == reflect.Bool {
            str, _ := client.Hget(key, typ.Field(i).Name)
            s, _ := StringToBool(str)
            f.SetBool(s)
        } else {
            log.Printf("field [%s] not set!%v %v \\n", typ.Field(i).Name, kind, typ.Field(i).Type)
        }
    }
    return nil
}

//字符串到Uint32
func StringToUint(b []byte) (uint64, error) {
    s := string(b)
    i, err := strconv.Atoi(s)
    if err == nil {
        return uint64(i), err
    } else {
        return 0, err
    }
}

//字符串到Int
func StringToInt(b []byte) (int64, error) {
    s := string(b)
    i, err := strconv.Atoi(s)
    if err == nil {
        return int64(i), err
    } else {
        return 0, err
    }
}

//字符串到float
func StringToFloat(b []byte) (float64, error) {
    s := string(b)
    i, err := strconv.Atoi(s)
    if err == nil {
        return float64(i), err
    } else {
        return 0, err
    }
}

//字符串到float
func StringToBool(b []byte) (bool, error) {
    s := string(b)
    i, err := strconv.Atoi(s)
    if err != nil {
        return false, nil
    }
    if i == 0 {
        return false, nil
    } else {
        return true, nil
    }
}
//该片段来自于http://outofmemory.cn

1.1 键值相关命令

1 创制安装目录

1.1.1 keys

回去满意给定 pattern 的富有 key

redis 127.0.0.1:6379> keys *

1) “myzset2”

2) “myzset3”

3) “mylist”

4) “myset2”

redis 127.0.0.1:6379>

用表明式*,代表抽取全数的 key

redis 127.0.0.1:6379> keys mylist*

1) “mylist”

2) “mylist5”

redis 127.0.0.1:6379>

用表明式 mylist*,代表收取全部以 mylist 起初的 key

mkdir -p /soft/redis

1.1.2 exists

承认叁个 key 是或不是存在

redis 127.0.0.1:6379> exists HongWan

(integer) 0

redis 127.0.0.1:6379> exists age

(integer) 1

redis 127.0.0.1:6379>

从结果来数据库中不设有 HongWan 那个 key,不过 age 那些 key 是存在的

cd /soft/redis/

1.1.3 del

剔除贰个 key

redis 127.0.0.1:6379> del age

(integer) 1

redis 127.0.0.1:6379> exists age

(integer) 0

redis 127.0.0.1:6379>

从结果来数据库中不设有 HongWan 这么些 key,不过 age 这么些 key 是存在的

2 下载安装

1.1.4 expire

安装三个 key 的晚点时间(单位:秒)

redis 127.0.0.1:6379> expire addr 10

(integer) 1

redis 127.0.0.1:6379> ttl addr

(integer) 8

redis 127.0.0.1:6379> ttl addr

(integer) 1

redis 127.0.0.1:6379> ttl addr

(integer) -1

redis 127.0.0.1:6379>

在本例中,我们设置 addr 这几个 key 的晚点时间是 10 秒,然后大家不住的用
ttl 来获得那个

key 的得力时间长度,直至为-1 表明此值已过期

wget

1.1.5 move

将眼下数据库中的 key 转移到此外数据库中

redis 127.0.0.1:6379> select 0

OK

redis 127.0.0.1:6379> set age 30

OK

redis 127.0.0.1:6379> get age

“30”

redis 127.0.0.1:6379> move age 1

(integer) 1

redis 127.0.0.1:6379> get age

(nil)

redis 127.0.0.1:6379> select 1

OK

redis 127.0.0.1:6379[1]> get age

“30”

redis 127.0.0.1:6379[1]>

在本例中,作者先显式的抉择了数据库 0,然后在这几个库中设置八个key,接下去我们将以此

key 从数据库 0 移到数据库 1,之后大家确定在数据库 0 中无此 key 了,
但在数据库 1 中留存

以此 key,表明大家转移成功了

tar xzf redis-3.2.3.tar.gz

1.1.6 persist

移除给定 key 的逾期时间

redis 127.0.0.1:6379[1]> expire age 300

(integer) 1

redis 127.0.0.1:6379[1]> ttl age

(integer) 294

redis 127.0.0.1:6379[1]> persist age

(integer) 1

redis 127.0.0.1:6379[1]> ttl age

(integer) -1

redis 127.0.0.1:6379[1]>

在这些事例中,大家手动的将未到过期时刻的 key,成功安装为过期

cd redis-3.2.3

1.1.7 randomkey

放肆重返 key 空间的四个 key

redis 127.0.0.1:6379> randomkey

“mylist7”

redis 127.0.0.1:6379> randomkey

“mylist5”

redis 127.0.0.1:6379>

透过结果能够看来取 key 的平整是随机的

yum install gcc

1.1.8 rename

重命名 key

redis 127.0.0.1:6379[1]> keys *

1) “age”

redis 127.0.0.1:6379[1]> rename age age_new

OK

redis 127.0.0.1:6379[1]> keys *

1) “age_new”

redis 127.0.0.1:6379[1]>

age 成功的被大家改名称叫 age_new 了

mkdir -p /soft/redis/redis3

1.1.9 type

重临值的类型

redis 127.0.0.1:6379> type addr

string

redis 127.0.0.1:6379> type myzset2

zset

redis 127.0.0.1:6379> type mylist

list

redis 127.0.0.1:6379>

以此办法能够非常简单的论断出值的品种

make PREFIX=/soft/redis/redis3 install

1.2 服务器相关命令

需要root权限

1.2.1 ping

测试连接是或不是存活

redis 127.0.0.1:6379> ping

PONG

//推行下边发号施令以前,大家截止 redis 服务器

redis 127.0.0.1:6379> ping

Could not connect to Redis at 127.0.0.1:6379: Connection refused

//实践下边发号施令此前,大家运行 redis 服务器

not connected> ping

PONG

redis 127.0.0.1:6379>

率先个 ping 时,表明此两次三番符合规律

其次个 ping 在此之前,大家将 redis 服务器甘休,那么 ping 是没戏的

其五个 ping 以前,我们将 redis 服务器运营,那么 ping 是马到功成的

cd utils/

1.2.2 echo

在命令行打字与印刷一些故事情节

redis 127.0.0.1:6379> echo HongWan

“HongWan”

redis 127.0.0.1:6379>

./install_server.sh

1.2.3 select

挑选数据库。Redis 数据库编号从
0~15,我们可以采取随机三个数据库来拓展数量的存取。

redis 127.0.0.1:6379> select 1

OK

redis 127.0.0.1:6379[1]> select 16

(error) ERR invalid DB index

redis 127.0.0.1:6379[16]>

当选用 16 时,报错,表达未有号码为 16 的这么些数据库

供给配置部分选项

1.2.4 quit

剥离连接。

redis 127.0.0.1:6379> quit

[root@localhost redis-2.2.12]#

端口  6379

1.2.5 dbsize

回到当前数据库中 key 的多寡。

redis 127.0.0.1:6379> dbsize

(integer) 18

redis 127.0.0.1:6379>

结果证实此库中有 18 个 key

配置文件  /soft/redis/redis3/conf/6379.conf

1.2.6 info

收获服务器的新闻和总结。

redis 127.0.0.1:6379> info

redis_version:2.2.12

redis_git_sha1:00000000

redis_git_dirty:0

arch_bits:32

multiplexing_api:epoll

process_id:28480

uptime_in_seconds:2515

uptime_in_days:0

redis 127.0.0.1:6379>

此结果用于注解服务器的根基音讯,包涵版本、运转时间等。

日记文件  /soft/redis/redis3/log/redis_6379.log

1.2.7 monitor

实时转储收到的伸手。

redis 127.0.0.1:6379> config get dir

1) “dir”

2) “/root/4setup/redis-2.2.12”

redis 127.0.0.1:6379>

从结果能够见到,此服务器近期接受了指令”keys *”和”get addr”。

数据文件  /soft/redis/redis3/data/6379

1.2.8 config get

获得服务器配置音讯。

redis 127.0.0.1:6379> config get dir

1) “dir”

2) “/root/4setup/redis-2.2.12”

redis 127.0.0.1:6379>

本例中大家收获了 dir
那几个参数配置的值,假设想获得全部参数据的配置值也很简短,只需

执行”config get *”即可将全方位的值都突显出来。

可施行文件  /soft/redis/redis3/bin/redis-server

1.2.9 flushdb

除去当前选拔数据库中的全体 key。

redis 127.0.0.1:6379> dbsize

(integer) 18

redis 127.0.0.1:6379> flushdb

OK

redis 127.0.0.1:6379> dbsize

(integer) 0

redis 127.0.0.1:6379>

在本例中大家将 0 号数据库中的 key 都免去了。

设置完授予权限

1.2.10 flushall

删除全体数据库中的全体 key。

redis 127.0.0.1:6379[1]> dbsize

(integer) 1

redis 127.0.0.1:6379[1]> select 0

OK

redis 127.0.0.1:6379> flushall

OK

redis 127.0.0.1:6379> select 1

OK

redis 127.0.0.1:6379[1]> dbsize

(integer) 0

redis 127.0.0.1:6379[1]>

在本例中大家先查看了贰个1号数据库中有三个key,然后本身切换来0号库施行flushall命令,

结果 1 号库中的 key 也被铲除了,说是此命令职业健康。

chmod 777 /soft/redis/redis3/

2.1:string类型及操作:string是最简易的数据类型,是二进制安全的,可以涵盖别的项目。

chmod 777 /soft/redis/redis3/conf/6379.conf

2.2.1 set

设置 key 对应的值为 string 类型的 value。

比如说大家抬高二个 name= HongWan 的键值对,能够如此做:

redis 127.0.0.1:6379> set name HongWan

OK

redis 127.0.0.1:6379>

chmod 777 /soft/redis/redis3/data/6379

2.2.2 setnx

安装 key 对应的值为 string 类型的 value。即便 key 已经存在,再次回到 0,nx
是 not exist 的意味。

举例大家增多贰个 name= HongWan_new 的键值对,能够那样做:

redis 127.0.0.1:6379> get name

“HongWan”

redis 127.0.0.1:6379> setnx name HongWan_new

(integer) 0

redis 127.0.0.1:6379> get name

“HongWan”

redis 127.0.0.1:6379>

由于原先 name 有贰个相应的值,所以此番的更改不奏效,且再次回到码是 0。

chmod 777 /soft/redis/redis3/data/6379/dump.rdb

2.2.3 setex

安装 key 对应的值为 string 类型的 value,并内定此键值对应的有效期。

诸如大家添加二个 haircolor= red 的键值对,并点名它的限时是 10
秒,能够如此做:

redis 127.0.0.1:6379> setex haircolor 10 red

OK

redis 127.0.0.1:6379> get haircolor

“red”

redis 127.0.0.1:6379> get haircolor

(nil)

redis 127.0.0.1:6379>

看得出由于最终一回的调用是 10 秒以往了,所以取不到 haicolor
这个键对应的值。

chmod 777 /soft/redis/redis3/log/redis_6379.log

2.2.4 setrange

安装钦定 key 的 value 值的子字符串。

诸如我们期待将 HongWan 的 126 邮箱替换为 gmail 邮箱,那么大家得以如此做:

redis 127.0.0.1:6379> get name

“HongWan@126.com”

redis 127.0.0.1:6379> setrange name 8 gmail.com

(integer) 17

redis 127.0.0.1:6379> get name

“HongWan@gmail.com”

redis 127.0.0.1:6379>

内部的 8 是指从下标为 8(包罗 8)的字符开首交替

chmod 777 /etc/init.d/redis_6379

2.2.5 mset

叁回设置几个 key 的值,成功再次来到 ok 表示全部的值都设置了,失利再次来到 0
表示并未别的值

被设置。

redis 127.0.0.1:6379> mset key1 HongWan1 key2 HongWan2

OK

redis 127.0.0.1:6379> get key1

“HongWan1”

redis 127.0.0.1:6379> get key2

“HongWan2”

redis 127.0.0.1:6379>

redis的一对坑 

2.2.6 msetnx

二次设置两个 key 的值,成功重回 ok 表示具备的值都安装了,退步再次回到 0
表示尚未其他值

被安装,但是不会覆盖已经存在的 key。

redis 127.0.0.1:6379> get key1

“HongWan1”

redis 127.0.0.1:6379> get key2

“HongWan2”

redis 127.0.0.1:6379> msetnx key2 HongWan2_new key3 HongWan3

(integer) 0

redis 127.0.0.1:6379> get key2

“HongWan2”

redis 127.0.0.1:6379> get key3

(nil)

能够看来借使那条命令归来 0,那么内部操作都会回滚,都不会被实行。

protected-mode yes

2.2.7 get

获得 key 对应的 string 值,如若 key 不存在重回 nil。

例如说我们收获二个库中设有的键 name,能够快速取得它对应的 value

redis 127.0.0.1:6379> get name

“HongWan”

redis 127.0.0.1:6379>

我们赢得一个库中不存在的键 name1,那么它会回去贰个 nil 以表时无此键值对

redis 127.0.0.1:6379> get name1

(nil)

redis 127.0.0.1:6379>

能够阅览 protected-mode 是为着禁止公网访问redis
cache,抓实redis安全的。它启用的标准化,有多个:

2.2.8 getset

设置 key 的值,并返回 key 的旧值。

redis 127.0.0.1:6379> get name

“HongWan”

redis 127.0.0.1:6379> getset name HongWan_new

“HongWan”

redis 127.0.0.1:6379> get name

“HongWan_new”

redis 127.0.0.1:6379>

接下去我们看一下只要 key 不存的时候会怎么着儿?

redis 127.0.0.1:6379> getset name1 aaa

(nil)

redis 127.0.0.1:6379>

可知,如若 key 不存在,那么将回到 nil

1) 没有bind IP

2.2.9 getrange

获得钦命 key 的 value 值的子字符串。

具体样举例下:

redis 127.0.0.1:6379> get name

“HongWan@126.com”

redis 127.0.0.1:6379> getrange name 0 6

“HongWan”

redis 127.0.0.1:6379>

字符串左面下标是从 0 先河的

redis 127.0.0.1:6379> getrange name -7 -1

“126.com”

redis 127.0.0.1:6379>

字符串右面下标是从-1 初始的

redis 127.0.0.1:6379> getrange name 7 100

“@126.com”

redis 127.0.0.1:6379>

当下标高出字符串长度时,将默以为是同方向的最大下标

2) 未有设置访问密码

2.2.10 mget

二次得到七个 key 的值,要是对应 key 不存在,则对应重返 nil。

切切实实样譬喻下:

redis 127.0.0.1:6379> mget key1 key2 key3

1) “HongWan1”

2) “HongWan2”

3) (nil)

redis 127.0.0.1:6379>

key3 由于未有那一个键定义,所以回来 nil。

譬如启用了,则只好够透过lookback ip(127.0.0.1)访问Redis
cache,假设从外网访问,则会回去相应的失实

2.2.11 incr

对 key 的值做加加操作,并再次来到新的值。注意 incr 叁个不是 int 的 value
会重临错误,incr 一

个不存在的 key,则设置 key 为 1

redis 127.0.0.1:6379> set age 20

OK

redis 127.0.0.1:6379> incr age

(integer) 21

redis 127.0.0.1:6379> get age

“21”

redis 127.0.0.1:6379>

消除方案  1  设置 protected-mode no  2  绑定ip或安装密码

2.2.12 incrby

同 incr 类似,加钦定值 ,key 不设一时候会设置 key,并认为原来的 value 是
0

redis 127.0.0.1:6379> get age

“21”

redis 127.0.0.1:6379> incrby age 5

(integer) 26

redis 127.0.0.1:6379> get name

“HongWan@gmail.com”

redis 127.0.0.1:6379> get age

“26”

redis 127.0.0.1:6379>

vi /soft/redis/redis3/conf/6379.conf

2.2.13 decr

对 key 的值做的是减减操作,decr 七个不设有 key,则设置 key 为-1

redis 127.0.0.1:6379> get age

“26”

redis 127.0.0.1:6379> decr age

(integer) 25

redis 127.0.0.1:6379> get age

“25”

redis 127.0.0.1:6379>

bind 192.168.50.128

2.2.14 decrby

同 decr,减钦定值。

redis 127.0.0.1:6379> get age

“25”

redis 127.0.0.1:6379> decrby age 5

(integer) 20

redis 127.0.0.1:6379> get age

“20”

redis 127.0.0.1:6379>

decrby 完全部是为着可读性,我们完全能够由此 incrby
一个负值来贯彻平等效劳,反之一样。

redis 127.0.0.1:6379> get age

“20”

redis 127.0.0.1:6379> incrby age -5

(integer) 15

redis 127.0.0.1:6379> get age

“15”

redis 127.0.0.1:6379>

requirepass yr_redis_20160920

2.2.15 append

给钦赐 key 的字符串值追加 value,重临新字符串值的长短。

比如说我们向 name 的值扩张贰个@126.com 字符串,那么能够那样做:

redis 127.0.0.1:6379> append name @126.com

(integer) 15

redis 127.0.0.1:6379> get name

“HongWan@126.com”

redis 127.0.0.1:6379>

pidfile /var/run/redis_6379.pid

2.2.16 strlen

取钦命 key 的 value 值的长短。

redis 127.0.0.1:6379> get name

“HongWan_new”

redis 127.0.0.1:6379> strlen name

(integer) 11

redis 127.0.0.1:6379> get age

“15”

redis 127.0.0.1:6379> strlen age

(integer) 2

redis 127.0.0.1:6379>

与此相同的时候修改对应运转服务

2.3 hashes 类型及操作, 非常契合用来存储对象

vi /etc/init.d/redis_6379

2.3.1 hset

设置 hash 田野先生 为钦定值,假使 key 不存在,则先创建。

redis 127.0.0.1:6379> hset myhash field1 Hello

(integer) 1

redis 127.0.0.1:6379>

修改

2.3.2 hsetnx

设置 hash 田野 为钦赐值,假诺 key 不存在,则先创立。尽管 田野先生已经存在,重临 0,nx 是

not exist 的意思。

redis 127.0.0.1:6379> hsetnx myhash field “Hello”

(integer) 1

redis 127.0.0.1:6379> hsetnx myhash field “Hello”

(integer) 0

redis 127.0.0.1:6379>

第一次实施是马到成功的,但第贰回施行一样的一声令下退步,原因是 field已经存在了。

PIDFILE=/soft/redis/redis3/redis_6379.pid

2.3.3 hmset

还要设置 hash 的五个 田野先生。

redis 127.0.0.1:6379> hmset myhash field1 Hello field2 World

OK

redis 127.0.0.1:6379>

在第8行 REDISPORT=”6379″上面增多 

2.3.4 hget

赢得内定的 hash 田野(field)。

redis 127.0.0.1:6379> hget myhash field1

“Hello”

redis 127.0.0.1:6379> hget myhash field2

“World”

redis 127.0.0.1:6379> hget myhash field3

(nil)

redis 127.0.0.1:6379>

出于数据库未有 田野同志3,所以取到的是二个空值 nil

REDISIP=”192.168.50.128″

2.3.5 hmget

得到全体钦点的 hash filed。

redis 127.0.0.1:6379> hmget myhash field1 field2 field3

1) “Hello”

2) “World”

3) (nil)

redis 127.0.0.1:6379>

是因为数据库未有 田野先生3,所以取到的是一个空值 nil

PWD=”yr_redis_20160920″

2.3.6 hincrby

点名的 hash filed 加上给定值。

redis 127.0.0.1:6379> hset myhash field3 20

(integer) 1

redis 127.0.0.1:6379> hget myhash field3

“20”

redis 127.0.0.1:6379> hincrby myhash field3 -8

(integer) 12

redis 127.0.0.1:6379> hget myhash field3

“12”

redis 127.0.0.1:6379>

在本例中大家将 田野同志3 的值从 20 降到了 12,即做了二个减 8 的操作。

修改 45行  $CLIEXEC -h $REDISIP  -p $REDISPORT -a $PWD  shutdown

2.3.7 hexists

测试钦点 田野(field) 是还是不是留存。

redis 127.0.0.1:6379> hexists myhash field1

(integer) 1

redis 127.0.0.1:6379> hexists myhash field9

(integer) 0

redis 127.0.0.1:6379>

由此上例能够印证 田野先生1 设有,但 田野同志9 是不存在的。

常用操作 

2.3.8 hlen

归来钦点 hash 的 田野(field) 数量。

redis 127.0.0.1:6379> hlen myhash

(integer) 4

redis 127.0.0.1:6379>

透过上例能够看看 myhash 中有 4 个 field。

启动redis服务 service redis_6379 stop

2.3.9 hdel

归来内定 hash 的 田野同志 数量。

redis 127.0.0.1:6379> hlen myhash

(integer) 4

redis 127.0.0.1:6379> hdel myhash field1

(integer) 1

redis 127.0.0.1:6379> hlen myhash

(integer) 3

redis 127.0.0.1:6379>

关闭redis服务 service redis_6379 start

2.3.10 hkeys

返回 hash 的所有 field。

redis 127.0.0.1:6379> hkeys myhash

1) “field2”

2) “field”

3) “field3”

redis 127.0.0.1:6379>

证实那一个 hash 中有 3 个 田野先生

重启redis服务 service redis_6379 restart

2.3.11 hvals

返回 hash 的所有 value。

redis 127.0.0.1:6379> hvals myhash

1) “World”

2) “Hello”

3) “12”

redis 127.0.0.1:6379>

证实这些 hash 中有 3 个 田野同志

查看redis状态 service redis_6379 status

2.3.12 hgetall

赢得某些 hash 中全部的 filed 及 value。

redis 127.0.0.1:6379> hgetall myhash

1) “field2”

2) “World”

3) “field”

4) “Hello”

5) “field3”

6) “12”

redis 127.0.0.1:6379>

足见,一下子将 myhash 中颇具的 田野同志 及对应的 value 都抽取来了。

ps -ef | grep redis

2.4 lists 类型及操作。list 是贰个链表结构,首要功效是 push、pop,能够做 旅馆和队列

redis-cli -h 192.168.50.128 -p 6379 -a yr_redis_20160920

2.4.1 lpush

在 key 对应 list 的底部增多字符串成分

redis 127.0.0.1:6379> lpush mylist “world”

(integer) 1

redis 127.0.0.1:6379> lpush mylist “hello”

(integer) 2

redis 127.0.0.1:6379> lrange mylist 0 -1

1) “hello”

2) “world”

redis 127.0.0.1:6379>

在此地大家先插入了叁个 world,然后在 world 的尾部插入了二个 hello。在那之中lrange 是用来

取 mylist 的内容。

那条命令是说要连接redis服务器,IP是192.168.50.128,端口是6379,密码是yr_redis_20160920。

2.4.2 rpush

在 key 对应 list 的尾巴增多字符串成分

redis 127.0.0.1:6379> rpush mylist2 “hello”

(integer) 1

redis 127.0.0.1:6379> rpush mylist2 “world”

(integer) 2

redis 127.0.0.1:6379> lrange mylist2 0 -1

1) “hello”

2) “world”

redis 127.0.0.1:6379>

在此间大家先插入了一个 hello,然后在 hello 的尾巴插入了四个 world。

keys * 是查看redis全部的键值对。

2.4.3 linsert

在 key 对应 list 的一定岗位从前或之后增添字符串成分

redis 127.0.0.1:6379> rpush mylist3 “hello”

(integer) 1

redis 127.0.0.1:6379> rpush mylist3 “world”

(integer) 2

redis 127.0.0.1:6379> linsert mylist3 before “world” “there”

(integer) 3

redis 127.0.0.1:6379> lrange mylist3 0 -1

1) “hello”

2) “there”

3) “world”

redis 127.0.0.1:6379>

在此间大家先插入了贰个 hello,然后在 hello 的尾巴部分插入了一个world,然后又在 world 的

近期插入了 there。

set test testredis 加多一个键值test,内容为testredis。

2.4.4 lset

设置 list 中钦定下标的成分值(下标从 0 开头)

redis 127.0.0.1:6379> rpush mylist4 “one”

(integer) 1

redis 127.0.0.1:6379> rpush mylist4 “two”

(integer) 2

redis 127.0.0.1:6379> rpush mylist4 “three”

(integer) 3

redis 127.0.0.1:6379> lset mylist4 0 “four”

OK

redis 127.0.0.1:6379> lset mylist4 -2 “five”

OK

redis 127.0.0.1:6379> lrange mylist4 0 -1

1) “four”

2) “five”

3) “three”

redis 127.0.0.1:6379>

在这里大家各样插入了 one,two,three,然后将标是 0 的值设置为
four,再将下标是-2 的值设

置为 five。

get test 查看test这么些键值的内容。

2.5.5 lrem

从 key 对应 list 中删去 count 个和 value 一样的因素。

count>0 时,按原原本本的相继删除,具体如下:

redis 127.0.0.1:6379> rpush mylist5 “hello”

(integer) 1

redis 127.0.0.1:6379> rpush mylist5 “hello”

(integer) 2

redis 127.0.0.1:6379> rpush mylist5 “foo”

(integer) 3

redis 127.0.0.1:6379> rpush mylist5 “hello”

(integer) 4

redis 127.0.0.1:6379> lrem mylist5 2 “hello”

(integer) 2

redis 127.0.0.1:6379> lrange mylist5 0 -1

1) “foo”

2) “hello”

redis 127.0.0.1:6379>

count<0 时,按从尾到头的各类删除,具体如下:

redis 127.0.0.1:6379> rpush mylist6 “hello”

(integer) 1

redis 127.0.0.1:6379> rpush mylist6 “hello”

(integer) 2

redis 127.0.0.1:6379> rpush mylist6 “foo”

(integer) 3

redis 127.0.0.1:6379> rpush mylist6 “hello”

(integer) 4

redis 127.0.0.1:6379> lrem mylist6 -2 “hello”

(integer) 2

redis 127.0.0.1:6379> lrange mylist6 0 -1

1) “hello”

2) “foo”

redis 127.0.0.1:6379>

count=0 时,删除全体,具体如下:

redis 127.0.0.1:6379> rpush mylist7 “hello”

(integer) 1

redis 127.0.0.1:6379> rpush mylist7 “hello”

(integer) 2

redis 127.0.0.1:6379> rpush mylist7 “foo”

(integer) 3

redis 127.0.0.1:6379> rpush mylist7 “hello”

(integer) 4

redis 127.0.0.1:6379> lrem mylist7 0 “hello”

(integer) 3

redis 127.0.0.1:6379> lrange mylist7 0 -1

1) “foo”

redis 127.0.0.1:6379>

redis监控 

2.4.6 ltrim

保存内定 key 的值范围内的数据

redis 127.0.0.1:6379> rpush mylist8 “one”

(integer) 1

redis 127.0.0.1:6379> rpush mylist8 “two”

(integer) 2

redis 127.0.0.1:6379> rpush mylist8 “three”

(integer) 3

redis 127.0.0.1:6379> rpush mylist8 “four”

(integer) 4

redis 127.0.0.1:6379> ltrim mylist8 1 -1

OK

redis 127.0.0.1:6379> lrange mylist8 0 -1

1) “two”

2) “three”

3) “four”

redis 127.0.0.1:6379>

2.4.7 lpop

从 list 的尾部删除成分,并重临删除元素

redis 127.0.0.1:6379> lrange mylist 0 -1

1) “hello”

2) “world”

redis 127.0.0.1:6379> lpop mylist

“hello”

redis 127.0.0.1:6379> lrange mylist 0 -1

1) “world”

redis 127.0.0.1:6379>

2.4.8 rpop

从 list 的尾巴部分删除成分,并重临删除成分

redis 127.0.0.1:6379> lrange mylist2 0 -1

1) “hello”

2) “world”

redis 127.0.0.1:6379> rpop mylist2

“world”

redis 127.0.0.1:6379> lrange mylist2 0 -1

1) “hello”

redis 127.0.0.1:6379>

2.4.9 rpoplpush

从第三个 list 的尾巴部分移除成分并增多到第四个 list
的头顶,最终回来被移除的成分值,整个操

作是原子的.即便第三个 list 是空恐怕不存在再次回到 nil

redis 127.0.0.1:6379> lrange mylist5 0 -1

1) “three”

2) “foo”

3) “hello”

redis 127.0.0.1:6379> lrange mylist6 0 -1

1) “hello”

2) “foo”

redis 127.0.0.1:6379> rpoplpush mylist5 mylist6

“hello”

redis 127.0.0.1:6379> lrange mylist5 0 -1

1) “three”

2) “foo”

redis 127.0.0.1:6379> lrange mylist6 0 -1

1) “hello”

2) “hello”

3) “foo”

redis 127.0.0.1:6379>

2.4.10 lindex

回到名为 key 的 list 中 index 地方的因素

redis 127.0.0.1:6379> lrange mylist5 0 -1

1) “three”

2) “foo”

redis 127.0.0.1:6379> lindex mylist5 0

“three”

redis 127.0.0.1:6379> lindex mylist5 1

“foo”

redis 127.0.0.1:6379>

2.4.11 llen

返回 key 对应 list 的长度

redis 127.0.0.1:6379> llen mylist5

(integer) 2

redis 127.0.0.1:6379>

2.5 sets 类型及操作,冬辰汇集

2.5.1 sadd

向名为 key 的 set 中添比索素

redis 127.0.0.1:6379> sadd myset “hello”

(integer) 1

redis 127.0.0.1:6379> sadd myset “world”

(integer) 1

redis 127.0.0.1:6379> sadd myset “world”

(integer) 0

redis 127.0.0.1:6379> smembers myset

1) “world”

2) “hello”

redis 127.0.0.1:6379>

本例中,大家向 myset
中增多了多少个元素,但出于第多个因素跟第贰个因素是同样的,所以

其七个因素未有增添成功,最终大家用 smembers 来查阅 myset 中的全数因素。

2.5.2 srem

剔除名称为 key 的 set 中的成分 member

redis 127.0.0.1:6379> sadd myset2 “one”

(integer) 1

redis 127.0.0.1:6379> sadd myset2 “two”

(integer) 1

redis 127.0.0.1:6379> sadd myset2 “three”

(integer) 1

redis 127.0.0.1:6379> srem myset2 “one”

(integer) 1

redis 127.0.0.1:6379> srem myset2 “four”

(integer) 0

redis 127.0.0.1:6379> smembers myset2

1) “three”

2) “two”

redis 127.0.0.1:6379>

本例中,我们向 myset2 中增添了八个成分后,再调用 srem 来删除 one 和
four,但由于成分

中绝非 four 所以,此条 srem 命令实行倒闭。

2.5.3 spop

自由回到并剔除名叫 key 的 set 中一个要素

redis 127.0.0.1:6379> sadd myset3 “one”

(integer) 1

redis 127.0.0.1:6379> sadd myset3 “two”

(integer) 1

redis 127.0.0.1:6379> sadd myset3 “three”

(integer) 1

redis 127.0.0.1:6379> spop myset3

“three”

redis 127.0.0.1:6379> smembers myset3

1) “two”

2) “one”

redis 127.0.0.1:6379>

本例中,大家向 myset3 中增添了几个要素后,再调用 spop
来随意删除贰个成分,能够见到

three 元素被剔除了。

2.5.4 sdiff

回来全数给定 key 与第一个 key 的差集

redis 127.0.0.1:6379> smembers myset2

1) “three”

2) “two”

redis 127.0.0.1:6379> smembers myset3

1) “two”

2) “one”

redis 127.0.0.1:6379> sdiff myset2 myset3

1) “three”

redis 127.0.0.1:6379>

本例中,大家得以看出 myset2 中的成分与 myset3 中不一样的只是
three,所以只有 three 被查

出来了,而不是 three 和 one,因为 one 是 myset3 的元素。

咱俩也得以将 myset2 和 myset3 换个顺序来看一下结出:

redis 127.0.0.1:6379> sdiff myset3 myset2

1) “one”

redis 127.0.0.1:6379>

本条结果中只突显了,myset3 中的成分与 myset2 中差别的因素。

2.5.5 sdiffstore

回去全数给定 key 与第三个 key 的差集,并将结果存为另三个 key

redis 127.0.0.1:6379> smembers myset2

1) “three”

2) “two”

redis 127.0.0.1:6379> smembers myset3

1) “two”

2) “one”

redis 127.0.0.1:6379> sdiffstore myset4 myset2 myset3

(integer) 1

redis 127.0.0.1:6379> smembers myset4

1) “three”

redis 127.0.0.1:6379>

2.5.6 sinter

回来全体给定 key 的插花

redis 127.0.0.1:6379> smembers myset2

1) “three”

2) “two”

redis 127.0.0.1:6379> smembers myset3

1) “two”

2) “one”

redis 127.0.0.1:6379> sinter myset2 myset3

1) “two”

redis 127.0.0.1:6379>

透过本例的结果能够观看, myset2 和 myset3 的混合 two 被查出来了

2.5.7 sinterstore

回去全体给定 key 的插花,并将结果存为另三个 key

redis 127.0.0.1:6379> smembers myset2

1) “three”

2) “two”

redis 127.0.0.1:6379> smembers myset3

1) “two”

2) “one”

redis 127.0.0.1:6379> sinterstore myset5 myset2 myset3

(integer) 1

redis 127.0.0.1:6379> smembers myset5

1) “two”

redis 127.0.0.1:6379>

经过本例的结果能够见到, myset2 和 myset3 的混合被保存到 myset5 中了

2.5.8 sunion

归来全部给定 key 的并集

redis 127.0.0.1:6379> smembers myset2

1) “three”

2) “two”

redis 127.0.0.1:6379> smembers myset3

1) “two”

2) “one”

redis 127.0.0.1:6379> sunion myset2 myset3

1) “three”

2) “one”

3) “two”

redis 127.0.0.1:6379>

因而本例的结果能够观望, myset2 和 myset3 的并集被查出来了

2.5.9 sunionstore

回来全数给定 key 的并集,并将结果存为另叁个 key

redis 127.0.0.1:6379> smembers myset2

1) “three”

2) “two”

redis 127.0.0.1:6379> smembers myset3

1) “two”

2) “one”

redis 127.0.0.1:6379> sunionstore myset6 myset2 myset3

(integer) 3

redis 127.0.0.1:6379> smembers myset6

1) “three”

2) “one”

3) “two”

redis 127.0.0.1:6379>

透过本例的结果能够观察, myset2 和 myset3 的并集被封存到 myset6 中了

2.5.10 smove

从第一个 key 对应的 set 中移除 member 并增加到第二个对应 set 中

redis 127.0.0.1:6379> smembers myset2

1) “three”

2) “two”

redis 127.0.0.1:6379> smembers myset3

1) “two”

2) “one”

redis 127.0.0.1:6379> smove myset2 myset7 three

(integer) 1

redis 127.0.0.1:6379> smembers myset7

1) “three”

redis 127.0.0.1:6379>

因此本例能够见到,myset2 的 three 被移到 myset7 中了

2.5.11 scard

回来名为 key 的 set 的成分个数

redis 127.0.0.1:6379> scard myset2

(integer) 1

redis 127.0.0.1:6379>

通过本例能够观察,myset2 的积极分子数量为 1

2.5.12 sismember

测试 member 是或不是是名字为 key 的 set 的因素

redis 127.0.0.1:6379> smembers myset2

1) “two”

redis 127.0.0.1:6379> sismember myset2 two

(integer) 1

redis 127.0.0.1:6379> sismember myset2 one

(integer) 0

redis 127.0.0.1:6379>

由此本例能够见见,two 是 myset2 的成员,而 one 不是。

2.5.13 srandmember

随意回到名字为 key 的 set 的二个要素,不过不删除成分

redis 127.0.0.1:6379> smembers myset3

1) “two”

2) “one”

redis 127.0.0.1:6379> srandmember myset3

“two”

redis 127.0.0.1:6379> srandmember myset3

“one”

redis 127.0.0.1:6379>

2.6 sorted sets 类型及操作,有序聚焦

2.6.1 zadd

向名为 key 的 zset 中添比索素 member,score
用于排序。假设该因素已经存在,则基于

score 更新该因素的顺序

redis 127.0.0.1:6379> zadd myzset 1 “one”

(integer) 1

redis 127.0.0.1:6379> zadd myzset 2 “two”

(integer) 1

redis 127.0.0.1:6379> zadd myzset 3 “two”

(integer) 0

redis 127.0.0.1:6379> zrange myzset 0 -1 withscores

1) “one”

2) “1”

3) “two”

4) “3”

redis 127.0.0.1:6379>

本例中我们向 myzset 中增加了 one 和 two,并且 two 被安装了 2
次,那么将以最终贰次的

设置为准,最后我们将有所因素都来得出来并出示出了元素的 score。

2.6.2 zrem

去除名为 key 的 zset 中的成分 member

redis 127.0.0.1:6379> zrange myzset 0 -1 withscores

1) “one”

2) “1”

3) “two”

4) “3”

redis 127.0.0.1:6379> zrem myzset two

(integer) 1

redis 127.0.0.1:6379> zrange myzset 0 -1 withscores

1) “one”

2) “1”

redis 127.0.0.1:6379>

能够观察 two 被删除了

2.6.3 zincrby

假定在称呼为 key 的 zset 中早已存在成分 member,则该因素的 score 增添increment;不然

向聚聚集增加该因素,其 score 的值为 increment

redis 127.0.0.1:6379> zadd myzset2 1 “one”

(integer) 1

redis 127.0.0.1:6379> zadd myzset2 2 “two”

(integer) 1

redis 127.0.0.1:6379> zincrby myzset2 2 “one”

“3”

redis 127.0.0.1:6379> zrange myzset2 0 -1 withscores

1) “two”

2) “2”

3) “one”

4) “3”

redis 127.0.0.1:6379>

本例元帅 one 的 score 从 1 扩张了 2,扩充到了 3

2.6.4 zrank

回去名称叫 key 的 zset 中 member 成分的排行(按 score 从小到大排序)即下标

redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

1) “one”

2) “1”

3) “two”

4) “2”

5) “three”

6) “3”

7) “five”

8) “5”

redis 127.0.0.1:6379> zrank myzset3 two

(integer) 1

redis 127.0.0.1:6379>

本例少校 two 的下标是 1,作者这里取的是下标,而不是 score

2.6.5 zrevrank

回来名称叫 key 的 zset 中 member 成分的排名(按 score 从大到小排序)即下标

redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

1) “one”

2) “1”

3) “two”

4) “2”

5) “three”

6) “3”

7) “five”

8) “5”

redis 127.0.0.1:6379> zrevrank myzset3 two

(integer) 2

redis 127.0.0.1:6379>

按从大到小排序的话 two 是第多个因素,下标是 2

2.6.6 zrevrange

回到名叫 key 的 zset(按 score 从大到小排序)中的 index 从 start 到
end 的兼具因素

redis 127.0.0.1:6379> zrevrange myzset3 0 -1 withscores

1) “five”

2) “5”

3) “three”

4) “3”

5) “two”

6) “2”

7) “one”

8) “1”

redis 127.0.0.1:6379>

率先按 score 从大到小排序,再收取全体成分

2.6.7 zrangebyscore

归来集结中 score 在给定区间的元素

redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

1) “one”

2) “1”

3) “two”

4) “2”

5) “three”

6) “3”

7) “five”

8) “5”

redis 127.0.0.1:6379> zrangebyscore myzset3 2 3 withscores

1) “two”

2) “2”

3) “three”

4) “3”

redis 127.0.0.1:6379>

本例中,返回了 score 在 2~3 区间的要素

2.6.8 zcount

归来集结中 score 在给定区间的数量

redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

1) “one”

2) “1”

3) “two”

4) “2”

5) “three”

6) “3”

7) “five”

8) “5”

redis 127.0.0.1:6379> zcount myzset3 2 3

(integer) 2

redis 127.0.0.1:6379>

本例中,计算了 score 在 2~3 之间的因素数目

2.6.9 zcard

重返聚积相月素个数

redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

1) “one”

2) “1”

3) “two”

4) “2”

5) “three”

6) “3”

7) “five”

8) “5”

redis 127.0.0.1:6379> zcard myzset3

(integer) 4

redis 127.0.0.1:6379>

从本例看出 myzset3 那个集全的要素数量是 4

2.6.10 zscore

重返给定成分对应的 score

redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

1) “one”

2) “1”

3) “two”

4) “2”

5) “three”

6) “3”

7) “five”

8) “5”

redis 127.0.0.1:6379> zscore myzset3 two

“2”

redis 127.0.0.1:6379>

此例中我们中标的将 two 的 score 抽取来了。

2.6.11 zremrangebyrank

删除集结中排名在给定区间的因素

redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

1) “one”

2) “1”

3) “two”

4) “2”

5) “three”

6) “3”

7) “five”

8) “5”

redis 127.0.0.1:6379> zremrangebyrank myzset3 3 3

(integer) 1

redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

1) “one”

2) “1”

3) “two”

4) “2”

5) “three”

6) “3”

redis 127.0.0.1:6379>

在本例中大家将 myzset3 中按从小到大排序结果的下标为 3 的成分删除了。

2.6.12 zremrangebyscore

除去会集中 score 在给定区间的成分

redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

1) “one”

2) “1”

3) “two”

4) “2”

5) “three”

6) “3”

redis 127.0.0.1:6379> zremrangebyscore myzset3 1 2

(integer) 2

redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores

1) “three”

2) “3”

redis 127.0.0.1:6379>

在本例中大家将 myzset3 中按从小到大排序结果的 score 在 1~2
之间的成分删除了。

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注