redis
Nosql是为了解决高并发,高扩展,高写入而产生的数据库解决方案
是关系型数据库的良好补充,而不能替代关系型数据库
Redis是用C语言开发的高性能的键值对存储的Nosql数据库。
redis是一个内存nosql数据库
redis中也是存储key-value形式的数据
redis中的key-value相比hbase等数据库来说,redis的value比较强大,它的value可以不仅仅是一个byte[]
redis的value可以有结构:可以是一个list,也可以是一个hash,也可以是set…
Redis存储的数据类型有五种:字符(string)、散列(hash)、列表(list)、集合(set)、有序集合(sorted set)
所以redis经常被称作为:数据结构服务器
redis的应用场景
缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用)
分布式集群架构中的session分离。
聊天室的在线好友列表。
任务队列。(秒杀、抢购、12306等等)
应用排行榜。
网站访问统计。
redis 的安装启动
在linux系统进行安装
1.下载redis5的稳定版本,下载地址http://download.redis.io/releases/redis-5.0.9.tar.gz
2.上传redis-5.0.9.tar.gz到Linux服务器
3.解压redis源码包
tar -zxvf redis-5.0.9.tar.gz -C /usr/local/src/
4.进入到源码包中,编译并安装redis
cd /usr/local/src/redis-5.0.9/
make && make install
5.报错,缺少依赖的包
6.配置本地YUM源并安装redis依赖的rpm包
yum -y install gcc
7.编译并安装
make && make install
8.报错,原因是没有安装jemalloc内存分配器,可以安装jemalloc或直接输入
make MALLOC=libc && make install
9.重新编译安装
make MALLOC=libc && make install
10.在/usr/local/下创建一个redis目录,然后拷贝redis自带的配置文件redis.conf到/usr/local/redis
mkdir /usr/local/redis
cp /usr/local/src/redis-5.0.9/redis.conf /usr/local/redis
11.修改当前机器的配置文件redis.conf
bind 172.16.200.103 127.0.0.1
daemonize yes #redis后台运行
requirepass 123456 #指定redis的密码
dir /data/redis #redis数据存储的位置
appendonly yes #开启aof日志,它会每次写操作都记录一条日志
12.启动redis节点
cd /usr/local/redis
redis-server redis.conf
13.查看redis进程状态
ps -ef | grep redis
使用命令登录:
redis-cli -h 172.16.200.103 -p 6379
#验证密码
auth 123456
停掉redis shutdown save
exit 退出 redis
flushdb 清理当前DB
select 2 选择第二个DB
set数据
set huzhongwu 666
set hh 222
get取数据
get huzhongwu
set数据指定key-value的超时时长 (超时时长为30秒)
set huzhongwu 8888 EX 30
keys *
Value为string类型命令使用
字符串 Map(String,String)
set xxx 111
get xxx
del xxx xxx1 xxx2
set aaa 111 ex 10 (超时10秒删除)
incr aaa aaa增长1
decr aaa aaa减少1
incrby aaa 10 aaa加10
mset k1 v1 k2 v2 k3 v3 设多个kv值
mget k1 k2 k3 得到多个k对应的v
strlen aaa 得到aaa值的长度length
Value为Hash类型命令使用
Hash类型 Map<String, Map<String,String>>
hset liaoning shengyang 1000
hset liaoning dalian 3333
keys *
hget liaoning shengyang
hgetall liaoning (返回 liaoning里的所有数据)
删除
hdel hebei shijiazhuang
hdel hebei qingdao
del hebei
hincrby hebei qingdao 5 qingdao加5
hincrby hebei qingdao 9
hdel hebei qingdao
del hebei
hmset hebei shijiazhuang 100 lf 200 xt 300
hmget hebei shijiazhuang lf xt
hexists he xt (hexists 是否存在)
hkeys hebei
hvals hebei
hlen hebei (hebei的value的length)
Value为List类型命令使用 list是有序可重复的
Redis的list使用的是linkedlist,linkedlist有两种方式:队列、堆栈。
在linkedlist中的头插法 和尾插法
队列中的名称: 入栈 push,出栈(弹栈) pop
lpush : 插入到队首
rpush: 插入到队尾
lrange 显示几个value -1 表示获取最后一个
127.0.0.1:6379> lrange list1 0 -1
弹出列表,则表示从列表中删除
127.0.0.1:6379> lpop list1
127.0.0.1:6379> rpop list1
获取列表长度
127.0.0.1:6379> llen list1
(integer) 8
Value为Set类型命令使用
Set Map<String,HashSet> 无序不能重复
sadd set1 1 2 2 3 3 4 5 (自动去重)
srem删除元素
127.0.0.1:6379> srem set1 3
判断元素是否存在
127.0.0.1:6379> sismember set1 3
smembers set1 取出全部成员
运算命令 差集 sdiff保留set1 中 与set2不重复的成员 属于A并且不属于B的元素构成的集合。
sdiff set1 set2
交集 属于A且属于B的元素构成的集合。
sinter set1 set2
并集 属于A或者属于B的元素构成的集合
sunion set1 set2
SortedSet(zset) Map<String,TreeSet> 不能重复可排序
score得分在前 member在后
zadd zset1 1 haha 3 hehe 2 heihei
zrange zset1 0 -1 取出 member
zrange zset1 0 -1 withscores 取出 member 和score
zrevrange zset1 0 -1 withscores 反排序 取出
zrem zset1 haha 删除
zscore zset1 haha 得到 haha的score
zrank zset1 hange 得到 hangge在升序排序的位置
zrevrank zset1 hange 得到hangge在降序排序的位置
zincrby zset1 100 hange hange的value增加100
Redis的scala的API
object StringValueDemo2 {
def main(args: Array[String]): Unit = {
val jedis: Jedis = new Jedis("192.168.133.201", 6379)
//授权
jedis.auth("123456")
//选择DB
jedis.select(0)
//添加数据
jedis.set("aaa", "111")
//自增
jedis.incr("aaa")
val str: String = jedis.get("aaa")
println(str)
jedis.incrBy("aaa",100)
val str2: String = jedis.get("aaa")
println(str2)
//关闭
jedis.close()
}
}
object ListValueDemo1 {
def main(args: Array[String]): Unit = {
val jedis: Jedis = new Jedis("192.168.133.201", 6379)
jedis.auth("123456")
jedis.select(0)
//添加数据
/*jedis.lpush("lst2", "1", "2", "3")
jedis.lpush("lst2", "4", "5", "6")*/
//插入数据 在数据"2"的后面插入一个数据 7
//jedis.linsert("lst2",ListPosition.AFTER,"2","7")
//删除count 个 value 删除2个 “7”
jedis.lrem("lst2", 2, "7")
val list: util.List[String] = jedis.lrange("lst2", 0, -1)
import scala.collection.JavaConversions._
for (e <- list) {
println(e)
}
}
}
object HashValueDemo1 {
def main(args: Array[String]): Unit = {
val jedis: Jedis = new Jedis("192.168.133.201", 6379)
//授权
jedis.auth("123456")
//选择DB
jedis.select(0)
jedis.hset("手机", "apple", "100")
jedis.hset("手机", "华为", "800")
jedis.hset("手机", "vivo", "500")
jedis.hset("电脑", "联想", "300")
jedis.hset("电脑", "小米", "800")
jedis.hset("电脑", "华为", "700")
jedis.hincrBy("手机", "华为", 100)
val map1: util.Map[String, String] = jedis.hgetAll("手机")
//导入隐式转换
import scala.collection.JavaConversions._
for (t <- map1){
println(s"key: ${t._1} -> value: ${t._2}")
}
jedis.close()
}
}
object SetValueDemo1 {
def main(args: Array[String]): Unit = {
val jedis: Jedis = new Jedis("192.168.133.201", 6379)
//授权
jedis.auth("123456")
//选择DB
jedis.select(0)
//添加数据
jedis.sadd("s1", "1", "2", "3", "4", "4", "5")
jedis.sadd("s2", "3", "4", "6", "5")
val sset: util.Set[String] = jedis.sdiff("s1", "s2")
//导入隐式转换
import scala.collection.JavaConversions._
for (s <- sset){
println(s)
}
}
}
object ZsetValueDemo {
def main(args: Array[String]): Unit = {
val jedis: Jedis = new Jedis("192.168.133.201", 6379)
//授权
jedis.auth("123456")
//选择DB
jedis.select(0)
//zset是不能重复,但是可以排序的,按照得分进行排序
/*jedis.zadd("z1", 5.5, "aaa")
jedis.zadd("z1", 6.5, "bbb")
jedis.zadd("z1", 3.5, "ccc")
*/
//jedis.zincrby("z1", 4.0, "ccc")
//val set1: util.Set[String] = jedis.zrevrange("z1", 0, -1)
//同时取出得分
val tuples: util.Set[Tuple] = jedis.zrevrangeWithScores("z1", 0, -1)
import scala.collection.JavaConversions._
for (s <- tuples){
println(s.getElement +" , "+ s.getScore)
}
}
}