1.启动 要在usr/local/bin 目录下
redis-server lconfig/redis.conf
#指定文件启动
redis-server &
#后台启动
-p
#指定端口启动
2.连接测试
redis-cli -p 6379
ping
3.常用命令
flushall 清空全部的16个数据库
flushdb 清空本数据库
ps -ef|grep redis 查询Redis进程
set
get
select 选择数据库
keys * 查看所有的key
exists name 判断name键是否存在
move name 1 移动name到数据库1
expire name 10 设置name过期时长为10 S
ttl name 查看name剩余失效时长
type name 查看name类型
redis-benchmark -p 6379 -c 100 -n 10000 测试100个并发,每个并发100000个请求、不加-h 就默认本机
4.五大数据类型和三种特殊数据类型
string 字符串
list 列表
set 集合
hash 散列
zset
sorted sets 有序集合
bimemaps
hyperloglog
geospatial
String 字符串(set/get)
append key hello 在key值后面追加hello key如果不存在,就创建key
strlen key 获取key的长度
set views 0 设置初始浏览量为0
incr xx 自增,计数器 Increment/增量,增加
decr xx 自减1 decrement/消耗
incrby xx 10 设置步长,自增10
decrby xx 10 设置步长,自减10
getrange key 0 3 key中0-3的子串 range 界限
getrange key 0 -1 最大子串
setrange key 3 xxx 从3开始替换
setex (set expire) 设置过期时间
setnx (set if not exist) 不存在 设置才会生效1 、 存在 设置不生效0
mset 批量
mget
msetnx 原子性操作 一个失败,批量失败
set user:1{name:zhangsan,age:3} 设置一个对象,值为json字符串
getset 组合命令 先get再set
string的使用场景:
计数器
统计多单位的数量
粉丝数
对象缓存存储
List 列表(push/pop 有序可重复)
list是列表 底层用链表实现 存储有序可重复的值
lpush list 1 头插法
rpush list 1 尾插法
lrange 0 -1 显示结果为倒序 list底层是链表 类似栈 先进后出
列表类型存储了一个有序的字符串列表。常用的操作是向两端插入新的元素。时间复杂度为 O(1)。结构为一个链表。记录头和尾的地址。
lpop 左弹出 第一个
rpop 右弹出 最后一个
lindex list 0 list下标为0的元素 栈顶元素
Llen list 返回列表长度
Lrem 移除
lrem list 1 one 移除一个值:list列表中的one 精确匹配
ltrim list 1 2 以元素下标1-2截取list trim 修剪
rpoplpush XXX 移除列表最后一个元素并push到XXX(一个新列表)
lset list 0 xxx 可用于更新元素
linsert list before/after "xxx" xxx 在"xxx"之前/之后插入xxx
链表增删快,链表第一次要找到指针位置为O(n),之后的增删都是O(1)
顺序表查询快 O(1)
在Redis中可以将List作为、栈、队列、阻塞队列
实际上是一个链表,left、right 都可以插入值
如果key不存在,创建新的链表
如果key存在,新增value
移除所有值,空链表
在两边插入效率最高,对中间元素操作,效率会降低
使用场景:消息排队! 消息队列(Lpush Rpush),栈(Lpush Lpop)
Set集合(add 无序不可重复 抽随机)
set是集合 存储无序且不可重复的值
sadd 添加
smembers set 获取set中的元素
Sismember set XXX 判断XXX在set中是否存在
scard set 获取set集合中的个数值
srem 移除
Srandmember 随机抽选出一个元素
spop 随机移除集合元素
smove myset myset2 XXX 将myset中的XXX移动到myset2中
**************************
微博,B站,共同关注
数字集合
差集:Sdiff key1 key2 key1和key2的差集 = key1 - (key1 ∩ key2) // A和B的差集 = A - AB
交集:Sinter key1 key2 共同好友就可以这样实现
并集:Sunion key1 key2
微博,A用户将所有关注的人放在一个set集合中! 每个人都唯一,粉丝也可以放在一个集合中
共同关注,共同爱好,二度好友,推荐好友!(六度分割理论)
Hash 散列
hash key-map 它的值是一个map集合
hset myhash key1 value1 / myhash-->key /set一个key-map
hget myhash key1 获取key1的值
hmset 批量set
hmget 批量get
hgetall xxx 获取xxx的全部键值对
hlen myhash 获取长度
Hexist 判断hash中指定字段是否存在
Hkeys 获取map中所有的key
Hvals 获取所有的value
Hincrby 递增,参数设置为负数就是递减
Hsetnx myhash XXX xxx 是否存在 不存在 设置才会生效1 、 存在 设置不生效0
hash应用:存储变更的数据 例如:user name age 尤其是用户信息保存
hash更适合用于对象存储,string更适合字符串存储
Zset(有序集合)
在set的基础上,增加了一个值,set k1 v1 // zset k1 score1 v1
zadd
zmembers
zrange myset 0 -1 获取所有的值
zrangebyscore XXX -inf +inf // 显示全部用户,按照XXX从小到大排序 ,inf-->无穷
zrevrange XXX 0 -1 // 按照XXX从高到底排序
zconut myset 1 3 获取指定区间的成员数量 闭区间
zcard 获取有序集合的个数
案例思路: set 排序 存储班级成绩表,工资表排序
普通消息 1 重要消息 2 带权重进行判断
排行榜实现
Geospatial 地理位置(add / pos)
朋友定位,附近的人,打车距离计算
地球南北两极无法直接添加,有效纬度范围 -85 到 85
一般会下载城市数据,直接通过Java程序一次性导入
有效经度范围从-180到180
key由(纬度,经度,名称)构成
geoadd 添加地理位置
geopos china:city zhengzhou 获取指定城市的经纬度信息
geodist china:city zhengzhou shanghai km 返回两个给定位置之间的距离
georadius china:city 110 30 500 km 根据半径 500 km 查找,110 30 中心点数据
GEORADIUS china:city 110 30 500 km withdist 查找到的对象距离中心点的距离
GEORADIUS china:city 110 30 500 km withcoord 查找到的对象的经纬度坐标
GEORADIUS china:city 110 30 500 km withcoord count 1 /// count限定只能查出来1个
GEORADIUS china:city 110 30 500 km withcoord desc 根据中心的位置,从远到近的方式返回元素
georediusbymember 根据半径查找,但是中心点是已经存在的(例如城市)
GEORADIUSBYMEMBER china:city zhengzhou 1000 km
geohash 返回geohash对位置进行的编码,用于内部调试,一般用不到
将二维的经纬度转换为一维的字符串,如果·两个字符串越接近,则距离越近
GEO底层实现原理就是 Zset 所以GEO可以使用zset命令
zrange china:city 0 -1 查询
zrem china:city zhengzhou 移除
Hyperloglog(是一种数据结构,做基数统计的算法)
A{1、1、2、3、4、5}
基数(不重复的元素的个数)= 5
网页的UV(访问量,一个人访问多次还是算作一个人)
传统的方式:set保存用户的ID,然后统计set中的元素数量作为标准,占用内存
hyperloglog优点:占用的内存是固定的,2^64 不同元素的基数,只需要12kb内存!0.81% 错误率
pfadd mykey a a b c d e f g h i j 创建第一组元素
pfcount mykey 数量10
pfmerge mykey3 mykey1 mykey2 // 合并mykey1 mykey2 到 mykey3 , 合并:merge
同时添加两个a的话,数量还是10 适用于页面统计,统计数量
允许容错,hyperloglog 不能容错,用set
Bitmaps(位图,操作二进制位进行记录,只有0|1两个状态)
位存储
统计疫情感染人数:0101
统计用户信息 活跃、不活跃 | 登录、未登录 | 打卡
365天 = 365 bit , 1字节 = 8 bit 46个字节左右
setbit
getbit
bitcount