Redis简单操作-window
2020-12-24 05:30
标签:高性能 c 语言 back 显示 java 没有 提前 sdi redis https://blog.csdn.net/bernkafly/article/details/89553711 redis概述 传统的数据访问: 缓存 + MySql 垂直拆分: 主从复制,读写分离: 分表分库+水平拆分+MySql 集群: 到了现在的数据访问流程: 3V + 3高: UDSL 这是阿里研发的数据库访问用的,如同我们连的jdbc ,我们不需要知道jdbc 怎么连接的数据库,我们直接连接jdbc 就可以了 UDSL 连接了多种数据库,因为如果找一个精通MySql、Oracle等多个数据库的人,是很难得,所有只要会用UDSL 就可以了 UDSL 完成了映射、API、热点缓存。。。 BSON 是一种类json 的一种二进制形式的存储格式,它和JSON 一样,支持内嵌的文档 和 数组对象 redis在项目中的位置 redis 是C 语言开发的高性能 键值对 的数据库 为了降低学习难度,现在window 下使用redis 。。。 安装完以后,双击redis-server.exe 运行redis 启动以后可以看到redis 默认端口是 6379,有一个PID,记住,然后把命令窗口关了再打开,发现PID 和刚刚的不一样,每次打开的都是不一样的, 切记:不可以打开两个redis 服务,会闪退的,除非把redis 端口改了,才可以打开多个redis 服务 先打开redis-server.exe 再打开redis-cli.exe 就可以看到端口号,说明连上了 redis 基本操作:k - value 操作!! 添加: set [key] [value] 比如: set wb wangbiao 查询: get [key] 比如: get wb * 如果不存在,返回 nil 然后可以打开服务端,再打开客户端,在客户端输入命令试试。。。 清屏: clear 退出: quit exit redis 数据类型 string hash list set sorted_set 数据类型指的是 右边的value 的类型! stirng:单个数据,也是最简单的存储类型,虽然可以存储数字,也可以用,比如100,但本质还是一个字符串 操作: 注意:如果已经存在 key,就是追加,如果之前没有key 就会新建一个 键值对 数据 数值增减操作:切记:只能对数字的string 操作,如果值 为字符串,那还怎么增减数字 啊,肯定会报错!!如果添加的为负数,那就等于是减少 比如数据量过大时候,一个表肯定不行,需要分表,这时候key 在不同表里会有重复的可能,就把数据覆盖了,造成了数据丢失, 解决方案: 数据时效设置:就是设置数据能活多久 切记:如果设置了存活多久以后,又 set key value 时候,如果 key 一样,之前的设置存活多久会直接无效,值也会被set 命令设置的值给替换掉! string 类型的注意: 数据最大存储量:512M 数值计算的最大范围:不能超过JAVA 中long 的最大值! string 类型的应用场景: 比如:需要给一个用户设置粉丝数,通常给key 设置的是:表名+主键+主键的值+属性,然后设置value 另外一种方法:以json 格式存储,比如需要设置粉丝,还设置博客订阅数 hash类型 因为redis 本来就是 key value 形式存储的,但hash 也是key value 这只的键值对形式,就是说,redis 的value 里又是一个键值对! 基本操作: hash 扩展 和 注意事项 注意:虽然hash 非常灵活,但是不要什么都往hash 里面塞东西,会很影响效率! hash 适合做购物车 这里有个语法非常重要: list 类型 这里指的是双向链表结构,list 类型数据操作都是stirng 类型的 基本操作: 要注意的是:比如从左边进去1 2 3 三个值,查到的结果是3 2 1 是反着的,如果想正着,那就容右边进 回想朋友圈的点赞: 比如,有个人取消了点赞,就直接从中间名单里消失, list 可以实现日志的消息队列,如下图: 现在日志存在a b c d 四台服务器,如果想要看所有的日志,总不能一个一个的服务器上拿日志,最好的是定义redis 的 key, 以key 的字段名去打印日志,最后在直接查找lrange log 0 -1 就把所有的日志都查出来了,因为list 本来就是自己会排序的 set 类型 存储大量数据,查询效率高,与hash 的存储结构完全相同,只存键,不存值,并且值不允许重复,可以利用不重复的特征去做 数据过滤 的问题 求两个集合的交、并、差集: 求两个集合的交、并、差集,并存在指定的集合中 把指定的数据从原始集合里 移动到 目标集合里 sorted_set 类型 除了像set 类型那样可以存储大量数据,但是支持排序 添加数据: 获取全部数据: 删除数据: 按条件查询数据: 条件删除数据: 获取集合数据总量: 集合交、并 操作: 获取数据对应的索引: score 值获取: 修改: sorted_set 注意事项: sorted_set 底层还是基于 set 结构的,它保存的数据可以是一个双精度 double 值,当修改数据时,虽然返回 0 看到的是修改失败,但实际有可能已经改了! redis 的 key 的通用操作: 为指定 key 设置有效期: 获取key 的有效时间: 把 key 设置成永久性的,可以一直访问的到的: 为 key 改名: 对所有 key 排序 redis 为了避免 key 的重复问题,把数据库分为16份,编号0--15 quit 退出。。 ping 为了测试是否连接上了服务,连接上的话会返回pang 没连上就没反应的 echo message 这个就是打印,后面跟什么,就打印什么 数据移动: move [key] [db] 比如:move aaa 1 就是提前先切换到有aaa 的这个数据库,执行了这个以后,aaa 就到了 1 数据库 数据清除:这个是危险操作! 使用 Jedis: 依赖: 然后就可以直接测试: jedis 里完整的包含了redis 里的所有方法!所以就想用redis 一样用 jedis 可以自己做一个JedisPool 的工具类: 写一个properties 文件: 工具类: redis-desktop-manager: 可视化操作redis 的工具 下一篇是Linux 上真实的玩转Redis Redis简单操作-window 标签:高性能 c 语言 back 显示 java 没有 提前 sdi redis 原文地址:https://www.cnblogs.com/abiu/p/13440919.html添加:set [key] [value]
添加多个:mset [key1] [value1] [key2] [value2] [key3] [value3]。。。 比如:mset a 姓名 b 性别 c 年龄 a b c 分别是三个值的 键!
切记:原来有的值,再写的话会覆盖,没有的就是添加
获取:get [key]
获取多个:mget [key1] [key3] [key3]。。。
删除:del [key]
获取数值的长度,就是字母的个数:strlen [key] 返回的一个数字,即字符串长度
在数值后面追加 数值内容:append [key] [value] 比如:已经有了一个键是 wb 值是 wangbiao 如果:append wb 111 的话,get wb 结果就是王彪111
incr [key] 可以通过key 设置value 就像主键自增一样,执行一次,value 就会+1
incrby [key] [increment] 和上面incr 一样,就是可以设置增加的数值,比如:之前如果有个key 为a,value 为1,incrby a 100,最后的value 值为 101
incrbyfloat [key] [increment] 通过命令就能看出来,是可以增加小数
decr [key] 可以减少数值,这个命令指的是一个一个减少
decrby [key] [increment] 可以设置减少数值的范围
setex [key] [seconds] [value] 设置数据存活多少秒 比如:setex a 10 abc 数值abc 就只有10秒存活时间
psetex [key] [milliseconds] [value] 设置数据存活多少毫秒
set user:id:321513:fans 99999
set user:id:321513 {id:321513,blogs:123,fans:99999}
如果执行的是之前存在的key ,那就会修改掉以前的数据
添加/修改数据: hset [key] [field] [value] 比如:hset user name wangbiao 再来一个:hset user age 25
添加多个值: hmset [key] [fied1] [value1] [field2] [value2] 比如:hmset user name wangbiaobiao age 3
获取数据: hget [key] [field] 比如:hget user name 返回wangbiao
hgetall [key] 比如hgetall user 返回的是user 这个hash 的所有属性
获取多个数据: hmget [key] [field1] [field2]。。。 比如:hmget user name age 获取的只有值,不像 hgetall key 那样,键值对都显示出来了
删除数据: hdel [key] [field1] [field2] 比如:删除一个就是 hdel user name 删除两个就是:hdel user name age
获取 key 的数量: hlen [key] 比如:hlen user 返回的就是2,因为user 里只有name 和 age 两个属性
获取哈希表是否有什么字段: hexists [key] [field] 比如:hexists user name 返回1,如果hexists user aaa 就返回的是0
获取一个哈希表里的所有字段: hkeys [key] 比如:hkeys user 返回的是user里的name 和 age 这两个属性
获取一个哈希表的所有值: hvals [key] 比如:hvals user 返回的是wangbiao 和 3 这两个user 里的值
设置指定字段增加数值: hincrby [key] [field] [increment] 比如:hincrby user age 1 返回的4
设置增加字段增加为小数: hincrbyfloat [key] [field] [increment]
hsetnx [key] [field] [value] 就是说,如果有这个数据,就会执行不成功,如果没有这个 field ,就会执行成功
添加/修改:
lpush [key] [value1] [value2]... 从左边添加数据 比如:lpush list1 1 2 3 添加一个 或 添加多个是一样的
rpush [key] [value1] [value2]... 从右边添加
获取数据:
lrange [key] [start] [stop] 比如:lrange list1 0 2 这个必须要添加开始 和 结束,如果不知道有多少个,那就lrange list1 0 -1
lindex [key] [index] 这个通过索引获取的一个 值!
len [key] 这个查到的是 list 数据类型里有多少个数值
删除数据:
lpop [key] 从左边删除出去一个
rpop [key] 从右边删除出去一个
规定时间内移除数据:
blpop [key1] [key2] [timeout] 可以设置多少秒以内可以获取数据,比如:blpop list1 10 就是十秒内数据有效,超过十秒就访问不到数据了,当然还可以写多个redis 的key ,那就等于是同多个数据结构里去找
brpop [key1] [key2] [timeout] 这个跟上面的一样,一左一右。。。
lrem [key] [count] [value] 删除指定数据,count 表示删除多少个,比如有多个一样的重复的数据,有5 个,我要删3个:lrem aaa 3 a
添加数据: sadd [key] [member1] [member2] 比如:sadd users zs li ww 添加张三李四王五
获取全部数据: smembers [key] 比如:smembers users
删除数据: srem [key] [member1] [member2] 比如:srem users ww 王五被删除
获取集合数据总量: scard [key] 比如:scard users 返回 2,因为刚刚ww 被删除了
判断集合是否包含指定数据: sismember [key] [member] 比如:sismember users zs 返回1,因为users里有zs 张三
随机获取集合中的一个 或 多个数据: srandmember [key] [count] 比如:srandmember users 1 返回的是随机的一个值
随机获取一个 或 多个数据,但是集合中就会直接移除,等于剪切的意思: spop [key] [count] 比如:spop users 2 获取两个,集合里就删除了两个
交:sinter [key1] [key2] 比如:sinter 集合1 集合2 返回的是两个集合里存在有的一样的数据
并:sunion [key1] [key2] 比如:sunion 集合1 集合2 返回的是连个集合合并的数据,当然,有重复的数据是只显示一次的
差:sdiff [key1] [key2] 这个看先后顺序,sdiff 集合1 集合2 和 sdiff 集合1 集合2 结果是不一样的
交:sinterstore [destination] [key1] [key2] 比如:sinterstore 集合3 集合1 集合2 这样就把1 和 2 交的部分存在了集合3里,下面的也是这种语法
并:sunionstore [destination] [key1] [key2]
差:sdiffstore [destination] [key1] [key2]
smove [source] [destination] [member] 比如:smove 集合2 集合1 aaa 就是把 集合2 里的 aaa 移到了 集合1里面了
zadd [key] [score1] [member1] [score2 member2]... 比如:zadd users 100 zs 90 ls 添加一个集合users ,zs张三成绩100,ls李四成绩90
zrange [key] [start] [stop] [WITHSCORES] 比如:zrange users 0 -1 返回的是成绩人的名字,如果:zrange users 0 -1 withscores 返回的是成绩人名字 + 成绩 都显示
zrevrange [key] [start] [stop] [WITHSCORES] 和上面用法一样,这个是倒叙,从大到小排列
zrem key member [member...] 比如:zrem users zs 张三成绩就删除了。。
zrangebyscore key min max [WITHSCORES] [LIMIT] 比如:zrangebyscore users 50 99 withscores 查看50 到 99 之间的分数
但是如果:zrangebyscore users 50 99 limit 0 3 withscores 分页查询,跟mysql一样的
zrevrangebyscore key max min [WITHSCORES] 跟上面一样的,倒序而已
zremrangebyrank key start stop 比如:zremrangebyrank users 0 1 按下标索引删除数据,这个就表示前两个删除了
zremrangebyscore key min max 比如:zremrangebyscore users 20 50 按数据值删除数据,20 到 50之间的数据都删除
zcard key 比如:zcard users 返回的是2,因为只有两个数据
zcard key min max 比如:在card key 50 99 获取50 到 99 之间有几个数据
zinterstore destination numkeys key [key]... 比如:zinterstore 集合3 集合1 集合2 返回的是,只有一样的数值名称,并且把值全相加了
但是如果:zinterstore 集合3 集合1 集合2 aggregate max 返回的是数值名称一样的值,最大的是值是多少
zunionstore destination numkeys key [key]...
zrevrank key member 比如:zrevrank users zs 查看zs 张三的下标索引是多少,这个从 小 到 大
zrank key member 比如:zrank users zs 这个和上面的一样,是从大到小排序的下标
zscore key member 比如:zscore users zs 获得zs 张三的值
zincrby key increment member 比如:zincrby users 50 zs zs 张三的值在原来基础上又加了 50
删除指定key: del [key]
查看key 是否存在: exists [key]
获取key 的类型: type [key]
expire [key] [secods] 比如:expire users 10 等10 秒过后,users 这个 key 无效了
pexpire [key] [milliseconds] 这个和上面一样,这个是设置的 毫秒 值
expireat [key] [timestamp] 这个是时间戳
pexpireat [key] [milliseconds-timestamp] 毫秒的时间戳
ttl [key] 可以查看key 还有多少秒 的有效时间 返回 -1,说明存在但没有设置有效期,返回-2,说明已经失效了
pttl [key] 这个是毫秒
persist [key]
rename [key] [newkey] 如果之前的名字存在,就直接改了,会覆盖掉之前的名字,之前的就不存在了
renamenx [key] [newkey] 如果有改的新的名字 也已经存在了,就会修改失败,改的新的名字没有存在的话,就会修改成功
sort + 后面有很多属性 可以sort users 这样就是从小到达排序,后面还可以再跟其他属性的方法,倒序,分组什么的
切换数据库: select [index] 比如:select 1 反正0 - 15之间的数字都可以,一般不会这么叫,只是确实存在分为了16个数据库
dbsize 看数据库有多少数据,返回一个数字
flushdb 这个会删除当前的数据库里所有的数据,坚决不用!
flushall 这个是所有的0--15 的数据库的所有数据全部删除!!坚决不用!
public class JedisTest {
@Test
public void testJedis(){
//1 连接redis
Jedis jedis = new Jedis("127.0.0.1", 6379);
//2 操作redis
jedis.set("name","wangbiao");
String name = jedis.get("name");
System.out.println(name);
//3 关闭释放连接
jedis.close();
}
}
redis.host=127.0.0.1
redis.port=6379
redis.maxTotal=30
redis.maxIdle=10
package com.biao.util;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.util.ResourceBundle;
public class JedisUtils {
private static JedisPool jp = null;
private static String host = null;
private static int port;
private static int maxTotal;
private static int maxIdle;
static {
ResourceBundle rb = ResourceBundle.getBundle("redis");
host = rb.getString("redis.host");
port = Integer.parseInt(rb.getString("redis.port"));
maxTotal = Integer.parseInt(rb.getString("redis.maxTotal"));
maxIdle = Integer.parseInt(rb.getString("redis.maxIdle"));
JedisPoolConfig jpc = new JedisPoolConfig();
jpc.setMaxIdle(maxIdle);
jpc.setMaxTotal(maxTotal);
jp = new JedisPool(jpc,host,port);
}
public static Jedis getJedis(){
return jp.getResource();
}
public static void main(String[] args) {
JedisUtils.getJedis();
}
}
上一篇:C# 无损压缩图片
下一篇:Delphi 注册快捷键