redis
一、基础知识
1、nosql
(1)发展历程
单机mysql->Memcached(缓存)+Mysql+垂直拆分(读写分离)->分库分表+水平拆分+mysql集群 ->Nosql
(2)定义
nosql=not only sql(不仅仅是sql)
(3)特点
1.方便扩展(数据之间没有关系,很好扩展)
2.大数据量高性能(Redis一秒写8万次,读11万次)
3.数据类型是多样性的(不需要预先设计数据库,随取随用)
(4)传统RDBS(关系型数据库)与nosql区别
传统RDBS:
1)结构化组织
2)数据库关系都存在单独的表中
3)用数据库定义的语言操作
4)严格的一致性
Nosql
1)不仅仅是数据,没有固定的查询语句
2)键值对存储、列存储、文档存储、图形数据库
3)最终一致性
4)CAP定理和BASE(异地多活)
5)高性能、高可用、高可扩
(5)Nosql四大分类
kv键值对----> redis
文档型数据库-----> MongoDB
------> conthDB
列存储数据库-------> Hbase
图关系数据库--------->Neo4j
--------->infogrid
2、大数据时代的3V 3高
(1)3v
海量、多量、实时
(2)3高
高并发、高可拓、高性能
3、redis基本概念
remote directionary server 远程字典服务
特性:
1、多样的数据类型
2、持久化
3、集群
4、事务
二、redis学习
1、redis-benchmark
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
2、redis基础命令
说明
1)redis命令不区分大小写
2)redis有16个数据库,默认使用第0个,可以使用select选取。
(1)select
选取数据库,从0开始,默认是0
select 0
select 1
(2)flush
清除当前数据库
flushdb
清楚所有数据库
flushall
(3)dbsize
查看当前数据库大小
dbsize
(4)keys *
查看所有key
keys *
(5)exists
判断key是否存在,如果存在返回1,不存在返回0
exists key
(6)move
从当前数据库把key移到‘1’数据库
move key 1
(7)del
del key
(8)expire
key还能存活10s
expire key 10
查看key还剩几秒存活时间
ttl key
(9)type
看key的类型
type key
(10)shutdown
关闭redis
shutdown
3、redis5大基本数据类型
(1)string类型
(a)set get方法
set key "abc"
get key
//先获取key的value,在把value设置成设定值(如果key不存在,就创建一个,并赋值为设定值)
getset key "abc"
//设置过期时间 (设置key的value为hello,并设置存活时间为30s)
setex key 30 "hello"
//如果key存在,则报错。如果key不存在,创建key并赋值为hello
setnx key "hello"
批量设定/获取
mset key1 value1 key2 value2
mget key1 key2
在key对应的value后面拼接字符串
append key "abc"
//有一个已经存在,则都存不进去,符合原子性操作,都不存在才能存入,一个存在就都不存入
msetnx k1 v1 k4 v4
设置对象
//设置一个user:1的对象,格式为json字符串.
set user:1 {name:gzx,age:5}
//如果user:1已经存在,则会更新key的value
//如果user:1不存在,则会创建user:1:name 和user:1:age 两个key
mset user:1:name gzx user:1:age 2
//以上两种方法都能用下面mget获取
mget user:1:name user:1:age
(b) append
//在key对应的value后面拼接hello
append key "hello"
(c) strlen
//获取key对应value的长度
strlen key
(d) incr和decr
//自增1
incr key
//自减1
decr key
//增加指定长度
incrby key 步长
incrby key 10 加10
incrby key -10 减10
decrby key 10 减少指定长度
(e) 截取
range key 0 3 截取字符串0-3(闭区间)
range key 0 -1 截取全部
(f) 替换
//把key对应的value,从指定索引(1)开始替换为xx
setrange key 1 xx
(2)list类型
(a)push
//在list集合最前面插入指定值
lpush list abc
//在list最后面插入指定值
rpush list abc
(b)range
//获取指定范围内的list元素
lrange list 0 3
lrange list 0 -1
(c)pop
//删除list第一个元素
lpop list
//删除list最后一个元素
rpop list
//删除list的最后一个元素,把它移动到list2的最前面
rpoplpush list list2
(d)index
//根据索引获取list中元素
lindex list 1
(e)len
//查看list长度
llen list
(f)rem
//删除1个list中值为one的元素
lrem list 1 one
//删除两个list值为two的元素
lrem list 2 two
(g)trim
//修剪mylist索引1-2的元素
ltrim mylist 1 2
(h)set
lpush list value1
//必须先创建list,才能set,否则报错
//更新索引为0的元素为value1
lset list 0 value1
(i)insert
//在list集合中value为one的元素前面插入abc
linsert list before "one" "abc"
//在list集合中value为one的元素后面插入abc
linsert list after "one" "abc"
(3)set类型
(a)增/删/查/移
//增
sadd set one
//删--rem 删除值为one的set元素
srem set "one"
//删-pop 随机删除一个set元素
spop set
//查--set长度
scard set
//查--查询set所有元素
smembers set
//随机获取 随机获取指定个数的set元素
srammember set 2
//移--将指定元素从一个set移动到另一个set
smove sourceset destinationset "abc"
(b)交集/并集/差集
//差集
sdiff set1 set2
//交集
sinter set1 set2
//并集
sunion set1 set2
(4)zset类型(有序集合)
(a)增/删/查
//新增,数字按照自己习惯来,不一定要从0开始,也不一定必须是连续的
zadd zset 1 one
zadd zset 2 two
zadd zset 5 three
//删 移除value为one的set元素
zrem zset one
//查
zrange zset 0 -1
//查-长度
zcard zset
//查-区间中集合元素数量(获得序号是1-3的元素数量)
zcount zset 1 3
(b)排序
//排序
//升序
zrangebyscore zset -inf +inf
//升序,且带编号,在负无穷到2500
zrangebyscore zset -inf +inf withscores
//升序,且带编号,在负无穷到2500
zrangebyscore zset -inf 2500f withscores
zrevrangebyscore zset 0 -1 //降序
(5)hash类型
(a)增/删/查
//增
hset hash key1 value1
//批量增加
hmest hash key1 value1 key2 value2
//不存在,就添加,存在报错,要是key1存在,则失败
hsetnx hash key1 value1
//查
hget hash key1
//批量获取
hmget hash key1 key2
//获取全部(把key和value都查出来)
//结果类型如下
/**
1)key1
2)value1
3)key2
4)value2
**/
hgetall hash
//获取所有key
hkeys hash
//获取所有value
hvals hash
//获取hash长度
hlen hash
//删
//删除指定key字段
hdel hash key1
(b)exists
hexisits hash key1 //key1存在返回1,不存在返回0
(c)自增/自减
//自增
hincrby hash key1 1
//自减
hincrby hash key1 -1
hdecrby hash key1 1
3、redis特殊数据类型
(1)geospatial
(a)geoadd
geoadd china:city 116.40(经度) 39.90(纬度) beijing
//批量添加
geoadd china:city 116.40 39.90 beijing 114.05 22.50 shenzhen
(b)geodist
//计算两点之间距离
geodist china:city beijing shanghai
(c)geohash
返回一个或多个位置元素的geohash表示(了解)
geohash china:city beijing chongqing
结果:
1)wx45+xxfkeo
2)wm5x2rgbtgo
两个结果过越相似,说明两个地点距离越近
(d)geopos
//获取经纬度
geopos china:city beijing
(e)georadius
//以某一个经纬度为中心,以某一个值为半径,进行搜索,找到圆内的所有点
georadius china:city 110.39(经度) 30.47(纬度) 1000(半径) km(单位)
单位:
m
km
mi 英里
ft 英尺
(f)georadiusbymember
根据某一名称的点为中心,某一设定值为半径,进行搜索,找到圆内的所有点
georadiusbymumber china:city beijing 1000 km
(g)补充(geospatial底层是zset)
//获取所有点
zrange china:city 0 -1
//删除指定点
zrem china:city beijing
(2)hyperloglog
基数统计,占用内存小,0.81%的容错率