ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# Redis * * * * * --: 作者:洪波 时间:2018年8月15日 * * * * * **优势简介:** 1:性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。 2:丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。 3:原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。 4:丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。 **go连接redis准备工作:** 1:github地址: https://github.com/garyburd/redigo 2:文档地址: http://godoc.org/github.com/garyburd/redigo/redis 3:获取类包:go get github.com/garyburd/redigo/redis ### 连接操作 package main import ( "fmt" "github.com/garyburd/redigo/redis" ) func main() { c, err := redis.Dial("tcp", "Ip:Port",redis.DialPassword("Password")) if err != nil { fmt.Println("Connect to redis error", err) return } defer c.Close() } ### String ### Hash ** Redis 哈希(Hash) Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。 Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)** //HSET key field value 将哈希表 key 中的字段 field 的值设为 value status,err := c.Do("HSET","hashKey1","field1","value1","field2","value2","field3",1) //返回添加成功的field个数 //HMSET key field1 value1 [field2 value2 ] 同时将多个 field-value (域-值)对设置到哈希表 key 中 status,err := c.Do("HMSET","hashKey1","a","a","b","b") //返回OK或FALSE即成功失败 //HSETNX key field value 只有在字段 field 不存在时,设置哈希表字段的值 status,err := c.Do("HSETNX","hashKey1","a","a") //返回添加成功的个数非0即1 //HKEYS key 获取所有哈希表中的字段 status,err := redis.Strings(c.Do("HKEYS","hashKey1")) //返回key对应的所有field //HVALS key 获取哈希表中所有值 status,err := redis.Strings(c.Do("HVALS","hashKey1")) //返回添加成功的个数非0即1 //HGET key field 获取存储在哈希表中指定字段的值 status,err := redis.String(c.Do("HGET","hashKey2","field2")) // 返回field对应的二进制值使用redis.String转换单个二进制 //HGETALL key 获取在哈希表中指定 key 的所有字段和值 status,err := redis.Strings(c.Do("HGETALL","hashKey2")) //返回哈希对应的所有的field与Value //HDEL key field1 [field2] 删除一个或多个哈希表字段 status,err := c.Do("HDEL","hashKey1","field1") //返回删除成功的field个数 //HEXISTS key field 查看哈希表 key 中,指定的字段是否存在 status,err := c.Do("HEXISTS","hashKey1","field2") // 返回个数 非0即1 //HINCRBY key field increment 为哈希表 key 中的指定字段的整数值加上增量 increment status,err := c.Do("HINCRBY","hashKey1","field1",1) //返回自增后的数值 值不存在会从1开始自动创建 //HLEN key 获取哈希表中字段的数量 status,err := c.Do("HLEN","hashKey1") //返回key对应field数量 fmt.Println(status,err) ### Set ** Redis 集合(Set) Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。 Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员))** // SADD key member1 [member2] 向集合添加一个或多个成员 status,err := c.Do("SADD","s4",1,) //返回添加成功的个数 // SCARD key 获取集合的成员数 status,err := c.Do("SCARD","s1") //返回集合成员的个数 // SDIFF key1 [key2] 返回给定所有集合的差集 status,err := redis.Strings(c.Do("SDIFF","s1","s2","s4")) //返回第一个集合与其他集合不相同的成员 // SINTER key1 [key2] 返回给定所有集合的交集 status,err := redis.Strings(c.Do("SINTER","s1","s2")) //返回第一个集合与其他集合相同的成员 // SUNION key1 [key2] 返回所有给定集合的并集 status,err := redis.Strings(c.Do("SUNION","s1","s2")) //返回去重的所有成员 // SISMEMBER key member 判断 member 元素是否是集合 key 的成员 status,err := c.Do("SISMEMBER","s1",2) //返回0或1存在或不存在 // SMEMBERS key 返回集合中的所有成员 status,err := redis.Strings(c.Do("SMEMBERS","s1")) //返回0或1存在或不存在 //SMOVE source destination member 将 member 元素从 source 集合移动到 destination 集合 status,err := c.Do("SMOVE","s1","s2",1) //返回移动成功的个数 //SRANDMEMBER key [count] 返回集合中一个或多个随机数 status,err := c.Do("SRANDMEMBER","s1",2) //随即返回指定数量集合成员 //SPOP key 移除并返回集合中的一个随机元素 status,err := redis.String(c.Do("SPOP","s1")) //随即删除一个集合成员并返回 //SREM key member1 [member2] 移除集合中一个或多个成员 status,err := c.Do("SREM","s1",2,3) //删除指定成员 fmt.Println(status,err) ### Sorted Set ** Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。 有序集合的成员是唯一的,但分数(score)却可以重复。 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)** // ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数 status,err := c.Do("ZADD","z1",1,"a",2,"b",3,"c") //返回添加成功的个数 // ZCARD key 获取有序集合的成员数 status,err := c.Do("ZCARD","z1") //返回成员的个数 // ZCOUNT key min max 计算在有序集合中指定区间分数的成员数 status,err := c.Do("ZCOUNT","z1",1,10) //返回符合的个数 // ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment status,err := redis.String(c.Do("ZINCRBY","z1",10,"a")) //返回增长后的结果 //ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合成指定区间内的成员 status,err := redis.Strings(c.Do("ZRANGE","z1",0,10)) //返回符合分数的成员 // ZRANGEBYLEX key min max [LIMIT offset count] 通过字典区间返回有序集合的成员 status,err := redis.Strings(c.Do("ZRANGEBYLEX","z1","-","(b")) //返回符合分数的成员 ????? // ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 通过分数返回有序集合指定区间内的成员 status,err := redis.Strings(c.Do("ZRANGEBYSCORE","z1",0,100,"WITHSCORES")) // ZRANK key member 返回有序集合中指定成员的索引 status,err := c.Do("ZRANK","z1","a") // ZREM key member [member ...] 移除有序集合中的一个或多个成员 status,err := c.Do("ZREM","z1","a") // ZREMRANGEBYLEX key min max 移除有序集合中给定的字典区间的所有成员 status,err := c.Do("ZREMRANGEBYLEX","z1","a","z") ??? //ZREMRANGEBYRANK key start stop 移除有序集合中给定的排名(按照分数排序递增)区间的所有成员 status,err := c.Do("ZREMRANGEBYRANK","myzset",1,2) //返回删除的个数 //ZREMRANGEBYSCORE key min max 移除有序集合中给定的分数区间的所有成员 status,err := c.Do("ZREMRANGEBYSCORE","myzset",1,2) //返回删除的个数 // ZREVRANGE key start stop [WITHSCORES] 返回有序集中指定区间内的成员,通过索引,分数从高到底 status,err := redis.Strings(c.Do("ZREVRANGE","myzset",0,100,"WITHSCORES")) //返回符合分数区间的成员 //ZREVRANGEBYSCORE key max min [WITHSCORES] 返回有序集中指定分数区间内的成员,分数从高到低排序 status,err := redis.Strings(c.Do("ZREVRANGEBYSCORE","myzset",0,100,"WITHSCORES")) ?? // ZREVRANK key member 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 status,err := c.Do("ZREVRANK","myzset","c") //ZSCORE key member 返回有序集中,成员的分数值 //status,err := redis.String(c.Do("ZSCORE","myzset","c")) fmt.Println(status,err) ### List ** Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边) 一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)** //LPUSH key value1 [value2] 将一个或多个值插入到列表头部 status,err := c.Do("LPUSH","l1",1,2,3,4) //返回添加成功的个数 // LPUSHX key value 将一个值插入到已存在的列表头部 status,err := c.Do("LPUSHX","l2",100) //返回添加成功的个数 // LRANGE key start stop 获取列表指定范围内的元素(索引) status,err := redis.Strings(c.Do("LRANGE","l1",0,-1)) //返回制定区间数据 //LREM key count value 移除列表元素 count=0 所有 count=1 从头到末检索 count=-1 从未到头检索 status,err := c.Do("LREM","l1",1,1) //返回删除数量 // LSET key index value 通过索引设置列表元素的值(索引从0开始) status,err := c.Do("LSET","l1",1,100) // LTRIM key start stop 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除 status,err := c.Do("LTRIM","l1",0,1) //RPOP key 移除并获取列表最后一个元素 status,err := c.Do("RPOP","l1") //返回删除的元素 //LINDEX key index 通过索引获取列表中的元素 status,err := redis.String(c.Do("LINDEX","l1",0)) //返回删除的元素 fmt.Println(status,err)