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个字节左右