redis基础
NoSQL非关系型数据库
- 方便扩展,数据之间没有关系
- 大数据高性能(redis一秒可以读取8万次)
- NoSQL是一种细粒度的缓存,性能会比较高
- 数据类型是多样性的,不需要事先设计数据库
- 传统的RDBMS
- 结构化组织
- SQL
- 数据和关系都存在单独的表中 row column
- 数据定义语言
- 严格的一致性
- 基础的事务
- NoSQL
- 不仅仅是数据
- 没有固定的查询语言
- 键值对存储、列存储、文档存储、图形数据库
- 最终一致性
- CAP定理4和BASE理论 (异地多活)
- 高性能、高可用性、高可扩展性
- 3V:海量、多样、实时/3高:高并发、高可扩、高性能
- RDBMS + NoSQL一起使用
- 在应用和底层数据元之间,构建一层代理
10.文档型数据库
- MongoDB基于分布式文件存储的数据库,C++编写,用来处理大量的文档
- MongoDB是一个介于关系型数据库和非关系型数据库之间的产品
- ConthDB
- 列存储数据库
- HBase
- 分布式文件系统
- 图关系数据库
redis基础
- redis是非关系型数据库、缓存数据库、远程字典服务、也被称为结构化数据库
- 基于网络,可基于内存可持久化的key-value数据库,提供多种语言的api
- 用处
- 内存存储、持久化
- 效率高可用于高速缓存
- 发布订阅系统
- 地图信息分析
- 计时器、计数器(浏览量)
- redis-benchmark官方压力测试工具
- redis是单线程的
redis命令
- 关机shutdown
select 1
切换数据库,默认16个数据库DBSIZE
查看DB大小- 启动
ps -ef|grep redis
redis-server redis-config/redis.conf
redis-cli -p 6379
- 查看所有的
key *
- 清空当前数据库
flushdb
- 清空所有数据库
flushall
- 是否存在key
exists name
- 将数据移动到数据库1
move name 1
- 10秒?10个滴答 过期
expire name 10
time to live ttl
- 追加
append key1 "hello"
- 加一操作
incr num
减一操作decr num
- 指定数值操作
incrby num 10 decrby num 4
- 截取字符串
getrange key1 0 3
- 替换相应位置的字符串
setrange key1 1 abc
setex key3 30 "hello"
设置过期时间setnx key3 "redis"
如果不存在再创建key3,如果存在直接创建失败- 批量设置,批量获取,
mset mget
,原子性操作一个不成功,全部都不成功,或者全部成功 - 设置一个对象
set user:1{name:zhangsan, age:2}
设置一个对象,值为jsonmset user:1:name zhangshang user:1:age 2
getset
先get再set- 操作命令记录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19127.0.0.1:6379[1]> dbsize #占用内存大小
(integer) 0
127.0.0.1:6379[1]> set name luxinwei
OK
127.0.0.1:6379[1]> get name
"luxinwei"
127.0.0.1:6379[1]> dbsize
(integer) 1
127.0.0.1:6379[1]> keys *
1) "name"
127.0.0.1:6379> getset db redis 如果不存在则返回nil,并设置新的
(nil)
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基本的数据类型,相当于双向队列
- lpush,rpush 尾部插入
- lpop,rpop 移除尾部
- lrange,rrange 范围
- lindex,rindex 下标
- ltrim,rtrim修剪,list截断
- rpoplpush 移除列表的最后一个元素,移动到新的列表中
- 列表存在,才能使用
lset list 0 item
linsert list before two twotwo
插入- 在收尾插入或改动值效率最高,中间元素效率较低
- 消息队列lpushrpop
- 栈lpushlpop
hash key-map集合
- hash更适合对象的存储
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28127.0.0.1:6379> hset myhash field hash1
(integer) 1
127.0.0.1:6379> hget myhash field
"hash1"
127.0.0.1:6379> hmset myhash field1 hello field2 world #批量创建
OK
127.0.0.1:6379> hmget myhash field1 field2
1) "hello"
2) "world"
127.0.0.1:6379> hgetall myhash #获取全部数据
1) "field"
2) "hash1"
3) "field1"
4) "hello"
5) "field2"
6) "world"
127.0.0.1:6379> hdel myhash field #删除指定字段
(integer) 1
127.0.0.1:6379> hexists myhash field2 #判断hash中是否存在指定字段
(integer) 1
127.0.0.1:6379> hset myhash field3 5
(integer) 1
127.0.0.1:6379> hincrby myhash field3 5 #指定增量
(integer) 10
127.0.0.1:6379> hsetnx myhash field3 hello #如果存在不可以设置
(integer) 0
127.0.0.1:6379> hsetnx myhash field4 hello #如果不存在可以设置
(integer) 1
Zset有序集合
- 在set基础上增加了一个值,set k1 v1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35127.0.0.1:6379> zadd myset 1 one
(integer) 1
127.0.0.1:6379> zadd myset 2 two 3 three
(integer) 2
127.0.0.1:6379> zadd salary 2500 a
(integer) 1
127.0.0.1:6379> zadd salary 1999 b
(integer) 1
127.0.0.1:6379> zadd salary 3000 c
(integer) 1
127.0.0.1:6379> zrangebyscore salary -inf +inf #正向排序
1) "b"
2) "a"
3) "c"
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores
1) "b"
2) "1999"
3) "a"
4) "2500"
5) "c"
6) "3000"
127.0.0.1:6379> zrevrangebyscore salary +inf -inf #反向排序
1) "c"
2) "a"
3) "b"
127.0.0.1:6379> zrem salart b #移除元素
(integer) 1
127.0.0.1:6379> zcard salary #获取成员数量
(integer) 3
127.0.0.1:6379> zadd myset 1 hello
(integer) 1
127.0.0.1:6379> zadd myset 2 world 3 aaaa
(integer) 2
127.0.0.1:6379> zcount myset 1 3 #获取指定区间的成员数量
(integer) 3
set排序作用
- 存储成绩表、工资表排序
- 排行榜
- 重要消息,带权重进行判断