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 ```