Redis是什么
Redis是目前最受欢迎的NoSQL(非关系数据库)数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库。一般用来做缓存来减少对Mysql的压力。
Redis连接
步骤
1.进入usr/local/bin
2.启动config文件夹里的redis.conf : redis-server config/redis.conf
3.输入 redis-cli -p 6379
查看进程(也就是看它开启没)
ps -ef|grep redis
退出redis
退出redis: shutdown
然后出现not connected,是未连接状态
此时输入: exit
彻底退出进行到我们的服务器指令这来
redis数据库命令
select 1 #切换到第一个数据库,默认0
DBSIZE #查看现在的数据库内有多少数据(DB)
FLUSHALL #清空全部数据库数据
flushdb #清空当前数据库数据
redis-benchmark 的性能测试
其中p是redis的端口号,c代表发送的次数,n代表总次数
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
redis认知
redis中默认有16个数据库,
redis可以用来作为数据库、缓存、消息中间件MQ
他是一个单线程!原因是他存储在内存,不用cpu的多线程的原因是以为多线程的话会上下文切换,还不如直接用单线程,
常见的数据类型
- list 列表
- String 字符串
- set 集合
- zset 有序集合
- hash 哈希
String(字符串)
keys * #查看所以的键
mset k1 v1 k2 v2 k3 v3 #批量创建,k1值为v1,k2值为v2....
msetnx k1 v1 k2 v2 #是一个原子性操作,要么一起成功要么一起失败
type name #查看name的类型
EXISTS #判断一个字段是否存在
move name #移除一个键
EXPIRE name 10 #设置键的过期时间
ttl name #查看name过期时间还剩多少
setex name 30 "hello" #创建一个30秒的name
APPEND name "ni" #在name值后面追加ni
incr age #让age数字加一,打比方类似于视频播放量什么的播放一次加一
decr age #让age数字减一
INCRBY age 10 #设置步长,指定该增量
GETRANGE name 0 2 #就是显示name值的第0个下标到第二个下标的值,如果2的值成负数显示的数值是全部
SETRANGE name 1 vv #就是修改name值的第1个下标后面的值,比如xiao,变成Xvvo
setnx name "xiao" #如果name不存在就创建一个name,反正创建失败,就不会导致像set一样直接替换了
#对象1
set user:1 {name:zhangsan,age:3} #设置一个user:1 对象 值为json字符来保存一个对象
get user:1
#对象2
mset user:2:name xiaoming user:2:age 123
mget user:2:name user:2:age
#getset的用法流程在下
127.0.0.1:6379> getset db redis# 如果不存在值,则返回 ni7
(ni1)
127.0.0.1:6379> get db"redis
127.0.0.1:6379> getset db mongodb # 如果存在值,获取原来的值,并设置新的值"redis"
127.0.0.1:6379> get db"mongodb"
List(列表)
list值可重复
lpush list one #没有list创建一个list给它存一个 one,有就直接存,但是顺序是越晚存的下标越小
rpush list a #这个的话直接存到最大下标的前面,与lpush相反
lrange list 0 -1 #输出list下标0到下标1里的值
lpop list #移除数组左边第一个值,也就是下标最小的那个值
rpop list #移除数组右边第一个值,也就是下标最大的那个值
lindex list 1 #显示list下标1的值
llen list #显示list一共有多少值
lrem list 1 a #移除list里面1个a,1可以不写都可以,也可以移除2个a,
ltrim list 1 2 #通过下标来截取出之间的值,list只保存截取出来的值
rpoplpush list alist #把list最后的值剪切到alist里中
lset list 0 aa #把下标0替换成aa,必须要有这个下标!
#LINSERT mylist before:before是后面的意思这个可以改成前面,所以意思是在list集合里面的world值后面添加一个other值,(默认顺序是越晚早的下标越大)
Rpush list "hello"
(integer)1
Rpush list "world"
(integer)2
LINSERT list before "world" "other"
(integer)3
LRANGE list 0 -1
1) "hello"
2) "other"
3) "world"
set(集合)
无序不可重复
sadd myset aa #创建一个set或者新增一个值
smembers myset #显示myset里所有的值
sismember myset aa #查看myset里是否有没有aa
scard myset #显示myset一共有多少个
srem myset aa #移除mysetr的aa
smove myset myset2 xiaobai #把myset的xiaobai移动到muset里
sadd key1 a
sadd key1 b
sadd key1 c
sadd key2 c
sadd key2 d
sadd key2 3
#差集
SDIFF key1 key2 #每个set第一个不同的值
“b”
“a”
#交集
sinter key1 key2 #他们两相同的值
"c"
#并集
sunion key1 key2 #这两个set的所以值显示出来,重复的显示一个
“b”
“c”
“e”
“a”
“d”
Hash(哈希)
map集合,key-value
hset myhash k1 kuan #在myhash里的k1里新增一个kuan
hget myhash k1 #显示myhash里的k1所有的值
hmset myhash k1 aa k2 bb #创建多个key-value
hmget myhash k1 k2 #查看多个key-value
hgetall myhash #查看所以key与value
hdel myhash ke #删除key
hlen myhash #查看多少有个key
Hexists myhash k1#看这个看是否存在
hkeys myhash #查看所以的key
hvals myhash #查看所以的value
zset(有序集合)
在set的基础上增加了一个值,用到的地方比如排行榜
set k1 v1 k1 v2, zset k1 score1 v1
zadd myset 1 one 2 two #1是顺序可以按照自己的来,one是值 ,可以创建多个也可以单个
zrange myset 0 -1 #查看全部值
#实验 2500列钱 a列是名字
#从小到大排序
zadd salary 2500 a
zadd salary 5000 b
zadd salary 500 c
ZRANGEBYSCORE salary -inf +inf #inf是无穷的意思,这段意思是 负无穷到正无穷钱排序
"c"
"a"
"b"
ZRANGEBYSCORE salary -inf +inf WITHSCORES #加了一个WITHSCORES显示钱,
"c"
"500"
"a"
"2500"
"b"
"5000"
ZRANGEBYSCORE salary -inf 2500 WITHSCORES #显示2500以及一下的值
"c"
"500"
"a"
"2500"
zrem myzset a#移除myset的a
三种特殊数据类型
geospatial
geospatial 地理位置简介
Redis的Geo在redis3.2版本就推出,这个功能可以推算出地理位置的信息,也就是两地直接的距离,方圆几里的人!
它只有六个命令
城市经纬度查询-国内城市经度纬度在线查询工具 (jsons.cn)
geoadd
#测试geoadd
#参数 key 值(维度,经度) 名字
#经度范围 -180 ~ 180 维度 -85.05112878 ~ 85.05112878
geoadd china:city 116.40 39.90 beijin #第一个数字是维度,第二个是经度
geoadd china:city 121.47 31.23 shanghai
geopos
#获得一个或者两个的详细的经度纬度
geopos china:city beijin shanghai
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
2) 1) "121.47000163793563843"
2) "31.22999903975783553
geodist
#显示beijin与shanghai的距离默认英寸,我这km设置了千米
geodist china:city beijin shanghai km
1067.3788"
georadius
#查找china里面的ciity所有在指定的经度纬度 范围的城市
#经度 纬度 查找半径的大小 单位
georadius china:city 110 30 1000 km withcoord #withcoord 显示到中间距离的位置
GEORADIUSBYMEMBER
#找出指定城市位置边上的城市,前也必须要在China:city里
GEORADIUSBYMEMBER china:city beijin 1000 km
zrem
#移除地区
zrem china:city shangha
Hyperloglog
基数
打比方:A{1,3,5,7,9,7} B{1,3,5,7,9}
那么基数(不重复的元素)=5 ,可以接受误差
也就是有两组元素再怎么有重复滴值,最终用这个的话直接给你统一了然后合并
简介
Redis 2.8.9版本就更新了Hyperloglog数据结构! Redis Hyperloglog基数统计的算法!
优点:占用的内存是固定,264不同的元素的技术,只需要废12KB内存!如果要从内存角度来比较的话Hyperloglog首选!
Hyperloglog是一个数据结构 操作二进制位来进行记录的,
网页的UV(一个人访问一个网站多次,但是还是算作一个人!)
传统的方式,set 保存用户的id,然后就可以统计set 中的元素数量作为标准判断! 这个方式如果保存大量的用户id,就会比较麻烦!我们的目的是为了计数,而不是保存用户id ; 0.81%错误率!统计UV任务,可以忽略不计的!
Bitmaps
存储
类似于用于统计用户信息:活跃不活跃!登录未登录!打卡:打卡、未打卡,都用Bitmaps
是一个数据结构 操作二进制位来进行记录的,
1字节=46个字节左右
后续扩展中........