Redis数据库

Redis 命令参考

本文只记录部分常用命令,具体命令请进入参考网站,如下:

参考网站:http://redisdoc.com/

Redis基本原理

Redis的基本使用

Redis默认有16个数据库,初始默认使用0号库,编号是0…15

  1. 添加key-value [set]
  2. 查看当前redis的所有key [keys*]
  3. 获取key对应的值 [get key]
  4. 切换redis数据库 [select index]
  5. 查看当前数据库的key-value数量 [dbsize]
  6. 清空当前数据库的key-value和清空所有数据库的key-value [flushdb flushall]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
127.0.0.1:6379> set key1 hello
OK
127.0.0.1:6379> get key1
"hello"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get key1
(nil)
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> get key1
"hello"
127.0.0.1:6379> dbsize
(integer) 1
127.0.0.1:6379> set key2 world
OK
127.0.0.1:6379> dbsize
(integer) 2
127.0.0.1:6379> keys *
1) "key2"
2) "key1"

Redis的增删改查操作

Redis的五大基本数据类型

String(字符串)、Hash(哈希)、List(列表)、Set(集合)、zset(sorted set 有序集合)

String(字符串)

string是redis最基本的类型,一个key对应一个value。

string类型时二进制安全的。除普通的字符串外,也可以存放图片等数据。

redis中字符串一个value最大时512M

1
2
3
4
127.0.0.1:6379> set name 夜行书生
OK
127.0.0.1:6379> get name
"\xd2\xb9\xd0\xd0\xca\xe9\xc9\xfa" #之所以会这样,是因为控制台读取不出来,但在代码中是可以显示的#

del

1
2
3
4
127.0.0.1:6379> set name ck
OK
127.0.0.1:6379> del name
(integer) 1

setex键秒值

将value关联到key,将key的生存时间设置以秒为单位,如果key已经存在,setex命令将覆盖救值。生存时间一到,删除key-value

1
2
3
4
5
6
127.0.0.1:6379> setex address 10 swun
OK
127.0.0.1:6379> get address
"swun"
127.0.0.1:6379> get address
(nil)

mset

同时设置一个或多个key-value对

mget

同时获取一个或多个key-value

1
2
3
4
5
6
127.0.0.1:6379> mset key1 1 key2 2 key3 3
OK
127.0.0.1:6379> mget key1 key2 key3
1) "1"
2) "2"
3) "3"

Hash(哈希,类似于go中的map)

Redis hash是一个键值对集合,是一个string类型的field(字段)和value(值)的映射表,hash特别适合用于存储对象(结构体)。

hset

存放一个user字段信息

1
2
127.0.0.1:6379> hset user name ck
(integer) 1

hmset

存放一个或多个user字段信息

1
2
127.0.0.1:6379> hmset user sex 22 job coder
OK

hget

获取一个user字段信息

1
2
127.0.0.1:6379> hget user name
"ck"

hmget

获取一个或多个user字段信息

1
2
3
4
127.0.0.1:6379> hmget user name age job
1) "ck"
2) "22"
3) "coder"

hgetall

获取所有的user字段信息

1
2
3
4
5
6
7
127.0.0.1:6379> hgetall user
1) "name"
2) "ck"
3) "age"
4) "22"
5) "job"
6) "coder"

hlen

统计一个hash有几个元素

1
2
127.0.0.1:6379> hlen user
(integer) 3

hexists

查看哈希表中的字段是否存在

1
2
3
4
127.0.0.1:6379> hexists user name
(integer) 1
127.0.0.1:6379> hexists user address
(integer) 0

hdel

删除一个或多个user字段信息

1
2
3
4
5
127.0.0.1:6379> hdel user name age
(integer) 2
127.0.0.1:6379> hgetall user
1) "job"
2) "coder"

List(列表)

列表是简单的字符串列表,按照插入顺序排序,可以添加一个元素到列的头部或者尾部。

List的本质是一个链表,List的元素是有序的,元素的值是可以重复的。

lpush/rpush

从左/右边添加一个或多个元素

1
2
3
4
127.0.0.1:6379> lpush city beijin tianjin chengdu
(integer) 3
127.0.0.1:6379> rpush city xian
(integer) 4

lrange

读取一个或多个元素(只有lrange一种读法)

1
2
3
4
5
6
7
#0和-1代表start和end下标。-1代表列表最后一个元素,-2代表倒数第二的元素#
127.0.0.1:6379> lrange city 0 -1
#从左读出#
1) "chengdu"
2) "tianjin"
3) "beijin"
4) "xian"

lindex

按照索引下标获取元素

1
2
127.0.0.1:6379> lindex city 1
"tianjin"

llen

返回列表key的长度

1
2
127.0.0.1:6379> llen city
(integer) 4

lpop/rpop

读取左/右边第一个元素,并移除

1
2
3
4
5
6
7
127.0.0.1:6379> lpop city
"chengdu"
127.0.0.1:6379> rpop city
"xian"
127.0.0.1:6379> lrange city 0 -1
1) "tianjin"
2) "beijin"

linsert

在链表指定元素之前或之后插入元素

1
2
3
4
5
6
7
8
9
10
11
12
13
127.0.0.1:6379> linsert city after beijin yinchuan
(integer) 3
127.0.0.1:6379> lrange city 0 -1
1) "tianjin"
2) "beijin"
3) "yinchuan"
127.0.0.1:6379> linsert city before yinchuan xian
(integer) 4
127.0.0.1:6379> lrange city 0 -1
1) "tianjin"
2) "beijin"
3) "xian"
3) "yinchuan"

del

删除链表

1
2
127.0.0.1:6379> del city
(integer) 1

Set/Zset(集合/有序集合)

Set是string类型的无序集合

Zset是string类型的有序集合

Set存放很多字符串元素,字符串元素是无序的,而且元素的值不能重复

这里主要说明set集合

sadd

添加集合中的元素

1
2
127.0.0.1:6379> sadd id 001 002 003
(integer) 3

smembers

从集合中取出所有的元素,是无序的

1
2
3
4
127.0.0.1:6379> smembers id
1) "003"
2) "002"
3) "001"

sismember

判断值是否是集合中的元素

1
2
127.0.0.1:6379> sismember id 055
(integer) 0

srem

删除指定值

1
2
127.0.0.1:6379> srem id 001 002
(integer) 2

使用go语言操作redis数据库

安装指令

1
go get github.com/gomodule/redigo/redis

连接redis

1
redis.Dial("tcp","127.0.0.1:6379")

Set/Get接口

向redis中写入数据string [key - value]

1
2
_ , err = conn.Do("set" , "id" , "001")//写入一个数据
_ , err = conn.Do("Mset" , "name" , "ck" , "job" , "coder")//写入多个数据

向redis中读取数据string [key - value]

1
2
3
//因为rep是空接口类型,id对应是string类型,需要转换
IdString , err := redis.String(conn.Do("get" , "id"))//读取一个数据
BodyString , err := redis.Strings(conn.Do("Mget" , "id" ,"name" ,"job"))//读取多个数据

向redis中写入数据hash类型

1
2
_ , err = conn.Do("Hset" , "user" , "name" , "夜行书生")//写入一个数据
_ , err = conn.Do("Hmset" , "user" , "age" , "22" ,"job" , "coder")//写入多个数据

向redis中读取数据hash类型

1
2
3
NameString  , err := redis.String(conn.Do("Hget" ,"user", "name"))//读取一个数据
BodyString , err := redis.Strings(conn.Do("Hmget" ,"user","name","age","job"))//读取多个数据
BodyString2 , err := redis.Strings(conn.Do("Hgetall" ,"user"))//读取所有数据

Redis连接池

流程如下:

  1. 事先初始化一定数量的连接,放入连接池
  2. 当Go需要操作redis时,直接从redis连接池中取出连接即可
  3. 这样可以节省临时获取redis连接的时间,从而提高效率

核心代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var pool *redis.Pool
pool = &redis.Pool{
Dial: func() (redis.Conn, error) { //初始化连接
return redis.Dial("tcp" , "127.0.0.1:6379")
},
TestOnBorrow: nil,
MaxIdle: 0, //最大空闲连接数
MaxActive: 0, //和数据库的最大连接数,0表示无限制
IdleTimeout: 0, //最大空闲时间
Wait: false,
MaxConnLifetime: 0,
}
conn := pool.Get() //从连接池中取出一个连接
pool.Close() //关闭连接池

使用案例:

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
//定义全局pool
var pool *redis.Pool

//初始化连接池
func init (){
pool = &redis.Pool{
Dial: func() (redis.Conn, error) { //初始化连接
return redis.Dial("tcp" , "127.0.0.1:6379")
},
//TestOnBorrow: nil,
MaxIdle: 8, //最大空闲连接数
MaxActive: 0, //和数据库的最大连接数,0表示无限制
IdleTimeout: 300, //最大空闲时间
//Wait: false,
//MaxConnLifetime: 0,
}
}

func main() {
conn := pool.Get() //从连接池中取出一个连接
defer conn.Close() //关闭连接

_ , err := conn.Do("set","name","夜行书生")
if err!=nil{
fmt.Println("存放数据失败 , err : " , err)
return
}

rep , err := redis.String(conn.Do("get" , "name"))
if err!=nil{
fmt.Println("取出数据失败 , err : " , err)
return
}

fmt.Println("name : ", rep)

}