目录
1.什么是redis
redis是一款开源的数据库 ,使用C语言编写,基于内存的且支持持久化,使用高性能的Key-Value的NoSQL数据库
支持数据结构类型: 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps等
2.redis的启动
我们已经安装好redis后,启动redis
redis-server 这样启动会在控制台显示一堆日志信息
nohup redis-server redis.cong& 这样就把日志信息输入到了cong文件下,界面非常清爽
我们复制当前的窗口输入: redis-cli 这样就成功连接了redis数据库
这样正常连接有可能连接不上,需要到redis的conf文件中查看
将daemonize no 更改为 daemonize yes
关掉redis,再重新连接就可连接上了,启动在redis的bin目录下,我这个图是有问题的。
3.关闭redis的方法
先查询到redis的有关进程,然后一个一个的杀掉
ps -aux| grep redis 显示所有redis占有的端口号和其他信息
kill - 9 端口号
4 .怎样在redis中存储数据
1.通过键值对方式存储数据,查询数据也是通过key来查询value的值
set key value
我们还可以通过可视化的界面来看存储的数据
这里用的是Redis Desktop Manager:
2. 存储信息如果key相同,后面录入的信息会覆盖前面的
3. 一次性传入/获取多个信息
mset key value(key1 value1...)
mget key value(key1 value1...)
set的时候key和value数量一定要对应上,不然会报错
注意事项:
key的值可以有多种取法:只要是可以转换成二进制序列的。例如:一个英文字母a,一个jpge文件
给key取名字的时候不易太长或太短,太短的话别人可能不知道你想表达的意思,太长的话因为redis的数据存储在内存中,key当然也在内存中存储,太多会占用内存空间
5.设置过期时间
1.创建键值对时就设置过期时间
set key value (ex 过期时间(秒)/ px 过期时间(毫秒) ) (nx/xx)
ex 1 就是期只有1秒
nx 是这个key不存在才可以加上
xx 是这个key存在了才可以加上
实例:创建一个新的键值对,5秒的生存期
对老的键值重新赋值,5000毫秒,也就是5秒的生存周期
2.先设置了键值对,再给过期时间
set key value
expire key 过期时间(秒)
pexpire key 过期时间(毫秒)
示例:
这里的时间还可以用时间戳来表示
set key value
expireat key 时间戳(秒)
pexpireat key 时间戳(毫秒)
直接百度搜一个时间戳转换器,同样我们在获取的时间加上5
到 2021-11-15 21:00:39 这个键值对的生命周期就结束了
3.查看生存时间
查看key的剩余生存时间,通过:
TTL key :显示剩余生存时间(秒)
PTTL key :显示剩余生存时间(毫秒)
key存在但没有设置TTL,返回-1 key存在,但还在生存期内,返回剩余的秒或者毫秒 key曾经存在,但已经消亡,返回-2(2.8版本之前返回-1)
演示:
没有设置生存周期的都是永久存在,TTL是-1
设置了生存时间 5秒,再查询一下生存周期
手打代码也需要时间的,可以看到剩余生存周期还有2669毫秒
6.查找键
keys * :查找所有的键值
keys (n)?: 查询长度为n的键值
keys a? :查询以a开头,长度为2的键值
...
这里面与正则表达式相关,不多展开来
7.一些基础命令
查看键类型 TYPE key
查看键是否存在 EXISTS key
键重命名 RENAME key newkey RENAMENX key newkey
键删除 DEL key [key ...]
键是不能够全删除的,del *不好使,他会把你的*识别为一个字符串
获取值 get key
获取多个给定的键的值 mget key [key ...]
返回旧值并设置新值getset key value 如果键不存在,就创建并赋值
字符串长度 string key
8.string类型的操作
append key value 如果键存在就追加value的值,不存在就等同set key value
getrange key start end 字符串的索引是从0开始的,我们可以写负的索引,但是顺序必须是从左往右的,获取这个范围的字符串
setrangre key offset value 从我们的索引开始将value的值覆盖到key中原value里
1.追加操作:向str中添加456
2. 获取操作:获取str中索引3到5的内容,倒数第3到最后一位的内容
顺序必须是从左往右的,不然返回空字符串,并不会报错
3.覆盖操作,将str中的内容从偏移量为5开始,value覆盖他们
9.步长增减
步长的加一/减一:incr key decr key
按照自己设置的大小增加/减小 incrby/decrby key 设置的大小
其实也用可以用加法代替减法,设置的大小写成负数,他就是减法了
1.value值加一
value值减一
这里我们value里写的值必须是int/float等数值类型
我们虽然输入1 ,实际上:在redis中存储是字符串”1“
增减方法会把字符串值解释成64位有符号的十进制整数来操作,结果依然转成字符串
”1“->1
先覆盖前面的value值:set a a ,试一下能不能自增
"a"->a 这并不是十进制的整数,显然是不能用incr 和 decr 的
2.增加自己设定的大小:加上3
减少自己设定的大小:减去3
好像没什么用的地方:
我在增加的地方只写了一个数字,他认为我是一个没有value值的key,并且给我加了一
10.位图bitmap
在redis中,位图是定义在字符串类型中,一个字符串类型的值最多可以存储512m字节的内容
位上限:2^32 b
这么将太抽象了,举个例子一个字符串”a“在redis中是怎么样的?
0110 0001 000 00...
前8位就是a的ascII码了,后面怎么跟这么多0?这后面的0不看做数据,不会占用内存
1.简单的查寻,获取,修改
查询单个字符
getbit key offset 获取某一位的值,先设置了k的值为a
a的二进制 0110 0001所以我这里就查到第七位,后面的都是0了
查询字符串
ab二进制 :0110 0001 0010 0010
下面重点查询第14位是不是1:
返回0或1在指定区间的位置
bitpos key bit start end
k的内容是a,对应二进制 0110 0001
设置某一位上的值
我将k的第6位改成1,第七位改成0,ab->bb
2.位操作
对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 dteskey 上 operation
可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种
BITOP AND destkey key [key ...] ,对一个或多个 key 求逻辑并,并将结果保存到 destkey
BITOP OR destkey key [key ...] ,对一个或多个 key 求逻辑或,并将结果保存到 destkey
BITOP XOR destkey key [key ...] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey BITOP NOT destkey key ,对给定 key 求逻辑非,并将结果保存到 destkey
除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入 当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0
演示:
首先创建2个键值对,然后进行与运算
这个结果是
a和b与运算后的结果 0110 0000 对应的acsII表字符结果是0
3.bitcount
作用:统计指定位区间上值为1的个数
bitcount key [start] [end] 从左向右从0开始,从右向左从-1开始,注意官方start、end是位,
bitcount testkey 0 0表示从索引为0个字节到索引为0个字节,就是第一个字节的统计
bitcount testkey 0 -1等同于BITCOUNT testkey 最常用的就是 BITCOUNT testkey
bitcount testkey 等同于bitcount testkey start end
上面的是统计单个的,下面我们来看看多个的
例题1:
网站用户的上线次数统计(活跃用户)
现在有一个用户id为1001,今年的第1天上线、第30天上线 ,我现在想要求出他登录多少天
利用位图,空的位置都是0,我按照登录日期设置成1,第一天登录就把位图0设置为1,上线一天就把对应位置设置为1
最后bitcount计算一下就好
例题2:
按天统计网站活跃用户 天作为key,用户ID为offset,上线置为1 求一段时间内活跃用户数
11-01 用户1,2登录
11-02 用户2登录
11-03 用户2登录
这里如果按照用户来写就不合适了,
按照每一天的日期,存储登录用户的id,再用位运算中的or 就可以把用户是否登录的信息确定下来了。