没有固定表结构
nosql的特点:
非关系型
分布式(做主从分离很简单)
开源的
水平可扩展
处理超大量数据
性能高
nosql适用场景
1、对数据高并发读写
2、海量数据高效率存储和访问
3、高可扩展和高可用
redis也支持事务,但过于简单
键值式存储,被称为数据结构服务器
支持:字符串 strings
哈希 hash
链表 list 模拟栈和队列
集合 set
有序集合 sorted set
这几种结构都支持 push/pop/add/remove取交集并集等
各种排序
可以周期性把数据写入磁盘或把修改操作写入追加的的记录文件(类似binlog)
php 先从redis中读取,出错则从mysql中读取, redis和mysql中的数据保持同步
string类型:
set name value #会被覆盖 永久有效
setnx name value #如果存在返回0,不会被覆盖,否则返回1, nx 是not exist的意思
setex name ttl value #设置有效期,可以覆盖重复的key
set name song@126.com
setrange name 6 gmail.com #从第六个字符开始替换(如果不如原字符串长,会保留原来的剩下的字符串部分) 返回值的总长度
get name #song@gmail.com
#删除某个key
del key
#批量设置 如果ok都成功,如果0则都不成功
mset key1 value1 key2 value2
#批量设置,不覆盖已经存在的key,如果ok都成功,如果0则都不成功
#msetnx
#设置一个值,并返回key的旧值
getset key value
#获取指定key的指定位置字符
getrange key start(从0开始) end
#批量获取
mget key1 key2 key3
#递增,并返回新值 key不存在则设置
incr key
#增加指定值 key不存在则设置
incrby key num(可以是负数)
decr 同上,递减
decrby 同上,递减指定值
#给指定key的字符串追加value,不存在则创建
append key value
#返回值的长度
strlen key
hash:是一个string类型的field和value的映射表
hset myhash key value #myhash可以看做一个表
hget
hsetnx #同上
hmset
hincrby
#检测某个字段是否存在1
hexists myhash age
#返回key的数量
hlen myhash user:1
#删除某个key
hdel
#返回哈希表所有的字段
hkeys myhash
#返回哈希表所有的值
#获取某个哈希中所有的key、val
hgetall
list:链表 key 理解为链表的名字 每个元素都是string类型的 双向链表 可以作为栈和队列
#从头部压入一个元素 返回list中的元素个数
lpush
#从第一个取到倒数第一个
lrange 0 -1
#从尾部压入一个元素
rpush
#linsert 在特定位置的前或者后添加字符串
linsert mylist before "one" two #在one前面(上面为链表头,下面为链表尾)添加two元素
#替换指定下标的值
lset index value #从0开始数
#从key对应list中删除n个和value相同的值(n<0从尾部,n=0全部删除)
lrem mylist n value
#保留指定key范围内的数据
ltrim mylist 1 -1
#从list头部删除一个元素
lpop
#从尾弹出
rpop
#从第一个list的尾部移除元素并添加到第二个list的头部
rpoplpush mylist1 mylist2
#返回index位置的元素的值
lindex mylist index
#返回链表的元素个数
llen
#删除指定下标 index 的值,没有原生的方法
lset mylist index "del"
lrem mylist 0 "del"
set:集合string类型的无序集合 set是通过hash table实现的
添加、删除、修改的复杂度都是O(1),可以取交集、并集、差集
#添加一个元素
sadd myset value
#列出所有元素
smembers myset
#删除一个元素
srem myset value
#随机弹出一个元素
spop myset
#两个集合的差集
sdiff myset1 myset2
#将myset1、myset2的差集存到myset3里
sdiffstore myset1 myset2 myset3
#取交集
sinter
sinterstore 同上
#并集
sunion
sunionstore
#将一个集合中的元素减去后放到另一集合中
smove myset1 myset2 value #把value从myset1 中移除,并添加到myset2中
#统计集合的元素个数
scard myset
#测试某个元素是否属于这个集合
sismember myset value
#随机返回一个元素,不删除元素
srandmember myset
sorted sets :有序集合 set的一个升级版本在set的基础上添加了一个顺序属性
#添加一个元素
zadd myset index value #需要指定index顺序值
#显示数据
zrange myset 0 -1 withscores
#删除
zrem myzset value
#对顺序号进行增加,返回新的顺序号
zincrby myzset 1 one
#显示值的索引值,注意并不是score值,先按score进行排序
zrank myzset value
#先按score从大到小排序
zrevrank 同上
#以score值来取值
zrangebyscroe myzset from to
#返回给定score区间的数量
zcounts myzset from to
#所有元素个数
zcard myzset
#按下标进行删除
zrembyrank
#按score进行删除
zrembyscore
#显示所有的key
keys *
#检测某个key是否存在
exists key
#删除一个键
del key
#设置某个键的过期时间 -1代表已经过期
expire key ttl
数据库编码 0-15 ,默认进入0数据库
select 0
#将当前数据库中的key,移动到其他库中
move key 1[数据库编号]
#让某个key不在过期
persist key
#随机返回key中的一个key
randomkey
#重命名一个key
rename old new
#返回key的类型
type key
#测试连接是否联通
ping
#输出一些信息
echo
#当前数据库的key的数据
dbsize
#redis服务器的一些信息
info
#获取配置信息
config get *
config get timeout #具体的条目
#清空当前数据库
flushdb
#删除所有数据
flushall
#设置密码
requirepass password
#验证密码
登陆成功后 auth password
redis-cli -a password
#开启主从复制 只需在slave配置文件中加入
slaveof 192.168.0.1 6379 #指定master的ip、端口
masterauth lamp #指定主机密码
#事务
multi
..... discard #取消队列中的命令
exec
#乐观锁
类似版本控制
#数据持久化
1、snapshotting(快照) 也是默认方式 #讲数据存到文件里
save 900 10 #900秒内如果有10个key被更改则保存快照 ,可以设置多个
如果中间宕机,会丢失最后一个的快照修改,且同步有延时
2、append-only-file (缩写aof)的方式 #将写改操作放到文件里,当redis重启时会通过执行文件中的内容重建整个数据库内容
由于os会在内核中缓存write的修改,所以有可能也不是立即写到磁盘上,这样还是会丢失数据
appendonly yes #使用aof持久化方式
appendfsync always #收到命令就立即写入磁盘,最慢,但是保证完全的持久化
appendfsync everysec #每秒写入一次 在性能和持久化方面做了很好的折中
appendfsync no #完全依赖os,性能最好,但持久化没保证
#订阅、发布
#订阅消息
subscribe tv1 tv2
#发布消息
publish tv1 "content"
更详细的命令请搜索 redis chm