文章目录
Redis 是一个键值对的数据库, 也就是 key-value 类型的, 这里的 key 一般都是String类型的, value的类型可以有多种.
基本类型:
- String 类型
- Hash 类型
- List 类型
- Set 类型
- SortedSet 类型
特殊数据类型:
- Gerspatial 地理位置
- Hyperloglog 基数计数
- BitMap 位图
| 命令 | 作用 |
|---|---|
| KEYS | 查看所有符合模板的key |
| DEL | 删除一个指定的key |
| EXISTS | 判断key是否存在 |
| EXPIRE | 给key设置有效期,到期会删除key |
| TTL | 查看key的剩余有效期 |
| HELP [command] | 查看命令的具体用法 |
注: Redis 的key允许有多个单词形成层级结构, 多个单词之间用:隔开, 例如 blog:user:1
① KEYS

② DEL

③ EXISTS

④ EXPIRE

⑤ TTL
这里返回 -2 就是删除了
返回 -1 就是存在且没有过期时间


⑥ 层级结构



value 为String类型, 根据不同的字符串格式, 也可以分为几类
- string: 普通字符串
- int: 整数
- float: 浮点数
注: 字符串类型最大空间不能超过512M
可以使用help @string 来查看string类型的所有方法, 这里展示一些常用的命令.
| 命令 | 作用 |
|---|---|
| SET [key] [value] | 添加或者修改已经存在的一个 String 类型的键值对 |
| GET [key] | 根据 key 获取 String 类型的 value |
| MSET [key] [value] ( [key] [value] …) | 批量添加多个 String 类型键值对 |
| MGET [key] ( [key] …) | 根据多个key获取多个String类型的value |
| INCR [key] | 让 key 自增1个 |
| INCRBY [key] [increment] | 让 key 自增 increment 个 |
| INCRBYFLOAT [key] [increment] | 让浮点型 key 自增 increment 个 |
| SETNX [key] [value] | 添加一个String类型键值对, 前提key不存在,否则不执行 |
| SETEX [key] [second] [value] | 添加一个String类型键值对并指定有效时间 |
① SET

② GET

③ MSET

④ MGET

⑤ INCR

⑥ INCRBY

⑦ INCRBYFLOAT

⑧ SETNX

⑨ SETEX

Hash类型的value, value内是 field+value 的格式
可以使用help @hash 来查看string类型的所有方法, 这里展示一些常用的命令.
| 命令 | 作用 |
|---|---|
| HSET [key] [field] [value] ([filed] [value] …) | 添加或者修改hash类型key的field的值 |
| HGET [key] [field] | 获取一个hash类型key的field的值 |
| HMSET [key] [field] [value] ([filed] [value] …) | 批量添加多个hash类型key的field的值 |
| HMGET [key] [field] ( [field] …) | 批量获取多个hash类型key的field的值 |
| HGETALL [key] | 获取hash类型的key中所有的field和value |
| HKEYS [key] | 获取一个hash类型的key中所有的field |
| HVALS [key] | 获取一个hash类型的key中所有的value |
| HINCRBY [key] [field] [increment] | 让hash类型key的字段自增 |
| HSETNX [key] [field] [value] | 添加一个hash类型的key的field的值, 如果存在就不执行 |
① HSET
这里hset可以添加一个,也可以批量添加

② HGET
这里的hget只能获取一个key的field的值

③ HMSET 和 HMGET


④ HKEYS 和 HVALS

⑤ HINCRBY

⑥ HSETNX

这里List可以看成一个双向链表
特点: ① 有序 ② 元素可重复 ③ 插入删除快 ④ 查询速度一般
| 命令 | 作用 |
|---|---|
| LPUSH [key] [element] ([element] …) | 向左侧插入一个或者多个元素 |
| LPOP [key] | 移除并返回列表左侧的第一个元素, 没有返回nil |
| RPUSH [key] [element] ([element] …) | 向右侧插入一个或者多个元素 |
| RPOP [key] | 移除并返回列表右侧第一个元素, 没有返回nil |
| LRANGE [key] [start] [stop] | 返回一段范围内的所有元素 |
| BLPOP [key] ([key]…) [timeout] | 在没有元素的时候等待指定时间, 而不是返回nil |
| BRPOP [key] ([key]…) [timeout] | 在没有元素的时候等待指定时间, 而不是返回nil |
① LPUSH


② LPOP


③ RPUSH


④ RPOP


⑤ LRANGE

⑥ BRPOP


和Java的Set类似
特点: 1. 无序 2. 元素不可重复 3. 查找快 4. 支持交集. 并集, 差集功能
| 命令 | 作用 |
|---|---|
| SADD [key] [member] ([member] …) | 添加一个元素 |
| SREM [key] [member] ([member] …) | 删除一个元素 |
| SCARD [key] | 返回元素个数 |
| SISMEMBER [key] [member] | 判断是否存在一个元素 |
| SMEMBERS [key] | 获取所有的元素 |
| SINTER [key] ([key] … ) | 求key1 和 key2的交集 |
| SDIFF [key] ([key] … ) | 求key1 和 key2的差集 |
| SUNION [key] ([key] … ) | 求key1 和 key2的并集 |
案例 将下列数据用 Redis 的Set集合来存储
A 的好友有: B , C , D
B 的好友有: C , E , F
利用Set的命令实现下列功能
① 计算A的好友有多少人
② 计算A和B的共同好友
③ 查询是A的好友却不是B的好友的人是哪些
④ 查询A和B的总共有哪些好友
⑤ 判断B是否是A的好友
⑥ 判断A是否是B的好友
⑦ A删除B的好友
首先将好友存入到列表里



① 计算A的好友有多少人

② 计算A和B的共同好友

③ 查询是A的好友却不是B的好友的人是哪些

④ 查询A和B的总共有哪些好友

⑤ 判断B是否是A的好友

⑥ 判断A是否是B的好友

⑦ A删除B的好友

是一个可排序的Set集合
特点: 1. 可排序 2. 元素不重复 3. 查询速度快
| 命令 | 作用 |
|---|---|
| ZADD [key] [score] [member] ([score] [member] …) | 添加一个或者多个元素, 如果存在,更新score值 |
| ZREM [key] [member] ([member] …) | 删除指定元素 |
| ZSCORE [key] [member] | 获取指定元素的score值 |
| ZRANK [key] [member] | 获取指定元素的排名 |
| ZCARD [key] | 获取元素个数 |
| ZCOUNT [key] [min] [max] | 统计指定范围内的元素个数 |
| ZINCRBY [key] [increment] [member] | |
| ZRANGE [key] [min] [max] | 获取指定排名范围内的元素 |
| ZRANGEBYSCORE [key] [min] [max] | 获取指定score范围内的元素 |
| ZDIFF [numkeys] key ([key] …) | 差集 |
| ZINTER [numkeys] key ([key] …) | 交集 |
| ZUNION [numkeys] key ([key] …) | 并集 |
所有排名默认是升序, 如果要降序在命令的Z后面添加REV即可, 例如ZREVRANK
案例
将班级的下列学生得分情况存入 Redis 的SortedSet中
A 85, B 89, C 82, D 95, E 78, F 92, G 76
实现以下功能
① 删除D同学
② 获取F同学的分数
③ 获取C同学的排名
④ 查询80分以下有几名同学
⑤ 给F同学加2分
⑥ 查出成绩前3名的同学
⑦ 查出成绩80分以下的所有同学
首先将成绩存入Redis中


① 删除D同学


② 获取F同学的分数

③ 获取C同学的排名

④ 查询80分以下有几名同学

⑤ 给F同学加2分

⑥ 查出成绩前3名的同学

⑦ 查出成绩80分以下的所有同学

system-view进入系统视图quit退到系统视图sysname交换机命名vlan20创建vlan(进入vlan20)displayvlan显示vlanundovlan20删除vlan20displayvlan20显示vlan里的端口20Interfacee1/0/24进入端口24portlink-typeaccessvlan20把当前端口放入vlan20undoporte1/0/10删除当前VLAN端口10displaycurrent-configuration显示当前配置02配置交换机支持TELNETinterfacevlan1进入VLAN1ipaddress192.168.3.100
gitclonehttp:www.git.com.cn........ 克隆git项目gitbranch 查看分支gitbranch-r查看远程分支gitpushorigin--delete分支名 删除远程分支tmpgitcheckout切换分支gitcheckout-b切换并创建分支gitcheckout-b分支名origin/分支名(如果远程分支已存在最好用此命令,在创建分支时会把远程分支最新代码一并拉下来,不会把原分支代码带过来)gitbranch-D删除分支gitpushorigin--delete分支名gitpush--set-upstreamorigin分支名 推送本地分支到远端g
背景:最近考虑java代码数据在保存redis时,通常要配置序列化,才能保存到redis中,然而我们知道Redis中也有序列化(RDB和AoF两种形式),有点混淆总结一下。java中数据保存redis过程序列化的原因是什么?解释:java虚拟机内存和redis内存是两块独立的内存空间,分属于两个不同的进程,不同的两个应用,在网络传输层表现为数据传输是用TCP二进制流进行传输的序列化最终的目的是为了对象可以跨平台存储,和进行网络传输。 而跨平台存储和网络传输的方式就是IO,而我们的IO支持的数据格式就是字节数组。java中如何序列化?packagecom.gisquest.cloud.oauth
我需要向我的应用程序(RubyOnRails)添加实时性,因此,我认为更好的方法是使用node.js+socket.io+redis。我在后端(node.js)中有这个application.js文件varapp=require('http').createServer();vario=require('socket.io');varredis=require('redis').createClient();var_=require('underscore')._;io=io.listen(app);io.configure(function(){io.set("transports"
用户请求的缓存正常流程图 上图是一个正常的简单的缓存流程!!!土豆用户去访问某宝,某宝请求redis看看缓存中有没有土豆用户请求的数据,如果redis中有该数据的缓存,则直接返回数据展示出来供应用户的需求,如果redis中没有该用户请求的数据,redis就会做一件事,去数据库中进行查找,数据库中查到值了之后做两件事情,第一件事:把数据返回到redis缓存中。第二件事:把查询到的数据返回到某宝中供用户的需求缓存雪崩: 举个例子:用户在双十二的时候,想去某宝抢购商品,用户点进去进入首页展示出了各种各样的商品,这些商品大部分都是缓存在redis中,对应了着很多key,加入这些key的缓存时间是三个小
我正在尝试写一个二级缓存(内存+redis),但是当一个key高并发访问时遇到了瓶颈,我尝试对每个key都使用mutex,但是这样增加了cpu很多因为loadFromDB需要100-200毫秒。func(s*Store)GetJsonObjectWithExpire(keystring,objinterface{},ttlint,fStoreLoadFunc)error{//firstreadfrommemoryv,ok:=s.mem.Get(key)ifok{ifv.Outdated(){to:=deepcopy.Copy(obj)gos.updateMem(key,to,ttl,f
由于Redis仅存储字符串,我想知道如何使用Go将Struct转换为字符串,从而实现与Javascript的JSON.stringify等效的功能。我尝试过类型转换:string(the_struct)但这会导致错误。 最佳答案 encoding/json包可用于轻松地将struct转换为JSON字符串,反之亦然(将JSON字符串解析为struct)。简单示例(在GoPlayground上尝试):typePersonstruct{NamestringAgeint}funcmain(){p:=Person{"Bob",23}//Str
我正在尝试弄清楚如何连接到Redis客户端,该客户端应该阻止端口6379上通过TCP的所有Redis连接。我正在使用的ruby客户端和telnet都可以连接和执行命令。我使用的golang客户端不能,我真的很困惑为什么。这是我的iptables定义:root@server:~#iptables-LChainINPUT(policyACCEPT)targetprotoptsourcedestinationACCEPTall--localhostanywhereACCEPTall--anywhereanywherectstateRELATED,ESTABLISHEDACCEPTtcp-
1、redis服务端配置认证密码(1)通过配置文件进行配置打开配置文件/usr/local/redis/etc/redis.conf找到#requirepassfoobared去掉行前的注释,并修改密码为所需的密码,保存文件requirepassmyRedis重启redis这个时候尝试登录redis,发现可以登上,但是执行具体命令是提示操作不允许1.redis-cli-h127.0.0.1-p63792.redis127.0.0.1:6379>3.redis127.0.0.1:6379>keys*4.(error)ERRoperationnotpermitted5.redis127.0.0.1
Git整体工作流程:Workspace:工作区Index/Stage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库一、版本仓库: 1.通过命令gitinit把这个目录变成git可以管理的仓库(这就欧科啦)(会生成.git文件)默认.git文件不显示2.gitadd xxxxx (将工作区的指定文件添加到暂存区中) 没有任何提示,说明已经添加成功了3.gitcommit-m ‘一些提交注释’(把文件提交到本地仓库)4.gitstatus (查看是否有文件没有被提交) 展示说明没有任何文件未提交,但是我现在继续来改下readme.txt内