Redis基础
## 数据类型
redis是一种高级的key:value存储系统,其中value支持五种数据类型
```
字符串(strings)
散列(hashes)
列表(lists)
集合(sets)
有序集合(sorted sets)
```
```
redis字符串(String)
set key value
{key:value}
redis列表(List)
rpush course java c++ php js node js #集合course右边加入6个元素
{source:[java c++ php js node js]}
redis集合(Set)
sadd <key> <value1> <value2> ...
127.0.0.1:6379> sadd course java c++ php js php node js #course中放入7个元素,会自动去重,成功插入5个 (integer) 5
{course:[ java c++ php js node]}
redis哈希(Hash)
hset user name ready age 30
{user:[
{name:ready},
{age,30}
]}
redis有序集合zset
zadd <key> <score1> <member1> <score2> <member2> ...
zadd topn 100 java 80 c 90 c++ 50 php 70 js
{topn:[
{100 :java}
{80 :c }
{90 :c++ }
{50 :php }
{70 :js}
]}
```
## 安装
### yum安装
```
#前提得配置好阿里云yum源,epel源
#查看是否有redis包
yum list redis
#安装redis
yum install -y epel-release
yum install redis -y
#安装好,启动redis
systemctl start redis
2.检测redis是否工作
redis-cli #redis 客户端工具
#进入交互式环境后,执行ping,返回pong表示安装成功
127.0.0.1:6379> ping
PONG
```
**redis可执行文件**
```
./redis-benchmark //用于进行redis性能测试的工具
./redis-check-dump //用于修复出问题的dump.rdb文件
./redis-cli //redis的客户端
./redis-server //redis的服务端
./redis-check-aof //用于修复出问题的AOF文件
./redis-sentinel //用于集群管理
```
### 容器启动
`docker run -u root -itd --name redis-test -p 6379:6379 redis:4.0.12`
```
# cat redis.conf
bind 0.0.0.0
maxclients 10000
#配置密码
#requirepass haoshuang
#安全保护机制,没密码不能使用
protected-mode no
#监听端口
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
#以守护进程方式运行
daemonize yes
supervised no
#讲redis服务的pid进程存入文件
pidfile /www/server/redis/redis.pid
#日志等级
loglevel notice
logfile "/data/redis.log"
```
`
#启动
root@4135a4cb826d:/data# redis-server ./redis.conf `
```
# -a passwd
root@4135a4cb826d:/data# redis-cli -p 6379 -h 127.0.0.1
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> auth passwd
```
## python链接redis
```
import redis
pool = redis.ConnectionPool(host='10.1.125.42',port=6379, db=0, password='qwer1234',decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.set('10.1.125.42', '/var/log/messages,/root/gopath/logagent/logs/main.log')
r.expire('10.1.125.42',5) # 5s过期
print(r.get('10.1.125.42'))
conn = redis.Redis(host="127.17.0.2",port=6379,db=0)
conn.set("name","dba")
result = conn.get("name").decode("utf-8")
print(result)
```
## go 连接redis
```
package redis
import (
"fmt"
"github.com/go-redis/redis"
"strings"
"time"
)
var Rdb *redis.Client
func InitClient(ipaddr, password string) (err error) {
Rdb = redis.NewClient(&redis.Options{
Addr: ipaddr,
Password: password,
DB: 0,
})
_, err = Rdb.Ping().Result()
if err != nil {
fmt.Printf("redis connect failed, err:%s\n", err)
return err
}
fmt.Println("redis connect succeed!")
return nil
}
func WatchFunct(key string) []string {
err := Rdb.Watch(func(tx *redis.Tx) error {
//str := tx.Get(key).String()
str, _ := Rdb.Get(key).Result()
_, err := tx.TxPipelined(func(pipeliner redis.Pipeliner) error {
time.Sleep(time.Second * 1)
pipeliner.Set(key, str, 0)
return nil
})
return err
}, key)
str, _ := Rdb.Get(key).Result()
if err != nil {
fmt.Println("tx exec failed:", err)
//fmt.Println("then key is :",str)
dirmap := strings.Split(strings.Replace(str, " ", "", -1), ",")
//fmt.Println(dirmap)
return dirmap
}
//fmt.Println("tx exec success ,then key is :",str)
dirmap := strings.Split(strings.Replace(str, " ", "", -1), ",")
//fmt.Println(dirmap)
return dirmap
}
```
```
package main
import (
"context"
"fmt"
"github.com/go-redis/redis/v8"
"time"
)
func Set(rdb *redis.Client, key, value string, t time.Duration) (err error) {
err = rdb.Set(context.Background(), key, value, t*time.Second).Err()
return err
}
func Get(rdb *redis.Client, key string) (err error, val string) {
val, err = rdb.Get(context.Background(), key).Result()
if err != nil {
if err == redis.Nil {
return nil, ""
} else {
return err, ""
}
} else {
return nil, val
}
}
func main() {
// 创建Redis客户端连接
rdb := redis.NewClient(&redis.Options{
Addr: "10.1.125.12:6375", // Redis的地址和端口
Password: "", // Redis的密码,如果没有设置密码则留空
DB: 12, // Redis的数据库,默认为0
})
defer rdb.Close()
key := "mykeys"
value := "walue"
// 执行Set操作
err := Set(rdb, key, value, 10)
if err != nil {
fmt.Printf("Set key err: %v", err)
}
// 等待1秒,模拟操作延迟
time.Sleep(1 * time.Second)
// 执行Get操作
err, v := Get(rdb, key)
fmt.Println(v)
}
```
## 基本命令
```keys * 查看所有key
type key 查看key类型
expire key seconds 过期时间
ttl key 查看key过期剩余时间 -2表示key已经不存在了
persist 取消key的过期时间 -1表示key存在,没有过期时间
exists key 判断key存在 存在返回1 否则0
del keys 删除key 可以删除多个
dbsize 计算key的数量
```
### 1.strings类型
```set 设置key
get 获取key
append 追加string
mset 设置多个键值对
mget 获取多个键值对
del 删除key
incr 递增+1
decr 递减-1
```
```
127.0.0.1:6379> CONFIG GET dir #获取Redis数据保存路径
1) "dir"
2) "/var/lib/redis"
127.0.0.1:6379> set name 'yu' #设置key
OK
127.0.0.1:6379> get name #获取value
"yu"
127.0.0.1:6379> set name 'yuchao' #覆盖key
OK
127.0.0.1:6379> get name #获取value
"yuchao"
127.0.0.1:6379> append name ' dsb' #追加key的string
(integer) 10
127.0.0.1:6379> get name #获取value
"yuchao dsb"
127.0.0.1:6379> set age "100" ex 100 #设置超时时间100s
OK
127.0.0.1:6379> mset user1 'alex' user2 'xiaopeiqi' #设置多个键值对
OK
127.0.0.1:6379> get user1 #获取value
"alex"
127.0.0.1:6379> get user2 #获取value
"xiaopeiqi"
127.0.0.1:6379> keys * #找到所有key
1) "user2"
2) "name"
3) "user1"
127.0.0.1:6379> mget user1 user2 name #获取多个value
1) "alex"
2) "xiaopeiqi"
3) "yuchao dsb"
127.0.0.1:6379> del name #删除key
(integer) 1
127.0.0.1:6379> get name #获取不存在的value,为nil
(nil)
127.0.0.1:6379> set num 10 #string类型实际上不仅仅包括字符串类型,还包括整型,浮点型。redis可对整个字符串或字符串一部分进行操作,而对于整型/浮点型可进行自增、自减操作。
OK
127.0.0.1:6379> get num
"10"
127.0.0.1:6379> incr num #给num string 加一 INCR 命令将字符串值解析成整型,将其加一,最后将结果保存为新的字符串值,可以用作计数器
(integer) 11
127.0.0.1:6379> get num
"11"
127.0.0.1:6379> decr num #递减1
(integer) 10
127.0.0.1:6379> decr num #递减1
(integer) 9
127.0.0.1:6379> get num
"9"
```
### 2.list类型
```
lpush 从列表左边插
rpush 从列表右边插
lrange 获取一定长度的元素 lrange key start stop
ltrim 截取一定长度列表
lpop 删除最左边一个元素
rpop 删除最右边一个元素
lpushx/rpushx key存在则添加值,不存在不处理
lpush duilie 'alex' 'peiqi' 'ritian' #新建一个duilie,从左边放入三个元素
llen duilie #查看duilie长度
lrange duilie 0 -1 #查看duilie所有元素
rpush duilie 'chaoge' #从右边插入chaoge
lpushx duilie2 'dsb' #key存在则添加 dsb元素,key不存在则不作处理
ltrim duilie 0 2 #截取队列的值,从索引0取到2,删除其余的元素
lpop #删除左边的第一个
rpop #删除右边的第一个
```
更多类型
strings
lists
sets集合 (有序集合)
无序集合
哈希
```
https://www.cnblogs.com/pyyu/p/9467279.html
```