一,nosql:泛指非关系型数据库
二 ,关系型 和非关系 有什么特点
1,关系型
bash
传统的RDBMS
结构化组织
SQL
数据和关系都存在单独的表中 row col
数据操作,数据定义语言
严格的一致性
基础的事务
。。。。。
2,非关系型
bash
NoSQL
不仅仅是数据
没有固定的查询语言
键值对存储,列存储,文档存储,图形数据库(社交关系)
最终一致性,
CAP定理 和 BASE(异地多活)
高性能,高可用,高扩展性
。。。。
三、Redis能干什么
Redis是一个开源的,能做数据库 、缓存、和消息中间件
Redis能干嘛?
- 内存存储、持久化、内存中是断电即失、所以说持久化很重要(rdb、aof)
- 效率高、可以用于高速缓存
- 发布订阅系统
- 地图信息分析
- 计时器、计数器( 浏览量)
- 等
四、redis 常用用法
bash
[root@iZ2zefrn59xpiawd7jgzxhZ ~]# ps -ef|grep redis #链接Redis
redis 4486 1 0 09:54 ? 00:00:08 /www/server/redi/src/redis-server 127.0.0.1:6379
root 17010 16956 0 11:44 pts/0 00:00:00 grep --color=auto redis
[root@iZ2zefrn59xpiawd7jgzxhZ ~]# redis-cli -p 6379
127.0.0.1:6379> ping #测试
PONG
127.0.0.1:6379> keys * #查看所有的
1) "key:__rand_int__"
127.0.0.1:6379> set name liuxukun # set key
OK
127.0.0.1:6379> set age 1
OK
127.0.0.1:6379> keys *
1) "key:__rand_int__"
2) "age"
3) "name"
127.0.0.1:6379> EXISTS name
(integer) 1
127.0.0.1:6379> EXISTS name1
(integer) 0
127.0.0.1:6379> move name 1
(integer) 1
127.0.0.1:6379> keys *
1) "key:__rand_int__"
2) "age"
127.0.0.1:6379> set name liu
OK
127.0.0.1:6379> EXPIRE name 10 #设置过期时间·
(integer) 1
127.0.0.1:6379> ttl name
(integer) 6
127.0.0.1:6379> ttl name
(integer) 5
127.0.0.1:6379>
127.0.0.1:6379> set name lxk
OK
127.0.0.1:6379> type name #查看类型
string
127.0.0.1:6379>
[root@iZ2zefrn59xpiawd7jgzxhZ ~]#
五,String(字符串)
string的使用场景:
- 计数器
- 统计多单位的数量 uid:99999:follow 0
- 粉丝数
- 对象缓存存储
bash
127.0.0.1:6379> set key1 v1 #设置值
OK
127.0.0.1:6379> get key1 #获得值
"v1"
127.0.0.1:6379> keys * #获得所有值
1) "key1"
2) "key:__rand_int__"
3) "name"
127.0.0.1:6379> EXISTS key1 #判断某一个key是否存在
(integer) 1
127.0.0.1:6379> APPEND key "hello"
#追加字符串,如果当前的key不存在,就相当于setkey
(integer) 5
127.0.0.1:6379> get key1
"v1"
127.0.0.1:6379> APPEND key1 "hello"
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> STRLEN key1 #获取字符串的长度
(integer) 7
127.0.0.1:6379> APPEND key1 ",lxk"
(integer) 11
127.0.0.1:6379> get key1
"v1hello,lxk"
######################################################
127.0.0.1:6379> set views 0 #初始浏览量为0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views #自增一
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> decr views #自减1
(integer) 1
127.0.0.1:6379> decr views
(integer) 0
127.0.0.1:6379> incrby views 10 # 可以设置步长,指定增量
(integer) 10
127.0.0.1:6379> decr views 5
(error) ERR wrong number of arguments for 'decr' command
127.0.0.1:6379> decrby views 5
(integer) 5
######################################################
字符串范围 range
127.0.0.1:6379> keys * #设置key1 的值
1) "key1"
2) "name"
3) "key:__rand_int__"
4) "key"
5) "views"
127.0.0.1:6379> get key1
"v1hello,lxk"
127.0.0.1:6379> GETRANGE key1 0 3 #截取字符串【0,3】
"v1he"
127.0.0.1:6379> GETRANGE key1 0 -2
"v1hello,lx"
127.0.0.1:6379> GETRANGE key1 0 -0
(error) ERR value is not an integer or out of range
127.0.0.1:6379> GETRANGE key1 0 -1 #获取全部的字符串和getkey是一样的
"v1hello,lxk"
#替换
127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> SETRANGE key2 1 xx #替换指定位置开始的字符串
(integer) 7
127.0.0.1:6379> get key2
"axxdefg"
######################################################
setex(set with expire) #设置过期时间
setnx(set with expire)# 不存在设置
127.0.0.1:6379> setex key3 30 "hello" #设置key3的值为hello,30秒后过期
OK
127.0.0.1:6379> ttl key3
(integer) 21
127.0.0.1:6379> get key3
"hello"
127.0.0.1:6379> setnx mykey "redis" #如果mekey不存在,创建mykey
(integer) 1
127.0.0.1:6379> keys *
1) "key1"
2) "name"
3) "key2"
4) "mykey"
5) "key:__rand_int__"
6) "key"
7) "views"
127.0.0.1:6379> setnx mykey "MonogoDB"#如果mykey存在,创建失败
(integer) 0
127.0.0.1:6379> get mykey
"redis"
######################################################
#mset
#mget
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 #同时设置多个值
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k3"
3) "k2"
127.0.0.1:6379> mget k1 k2 k3 #同时获取多个值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx k1 v1 k4 v4 #msetnx是一个原子性的操作,要么一起成功,要么一起失败
(integer) 0
127.0.0.1:6379> get k4
(nil)
#对象
set user:1 {name:zhangsan,age:3}#设置一个user:1对象值为json字符来保存一个对象!
#这里的key是一个巧妙的设计:user:{id}:{filed},如此设计在Redis中是完全OK的
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 2
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "2"
######################################################
getset#先get然后再set
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"