高性能网站——使用redis

来源:互联网 发布:面向对象java试题 编辑:程序博客网 时间:2024/06/16 23:07

一开始在我的个人网站上,一些内容直接从DB读取出来吐到前端显示,然后我用自己写的一个高并发压力测试程序去测试我的网站,结果网站报错,看了一下是因为DB同时hold不住这么多文件描述符(操作系统不允许DB同时打开那么多个文件),导致了我的DB崩溃了,网站不能访问。这时候有两个解决方案,一个是修改操作系统的配置,允许打开大量的文件;另一种就是采用redis作为不重要数据的存储手段。

对于网站的性能来说,直接从DB(硬盘)读取数据的性能比从redis中读取数据的性能差太多,特别是对于性能要求很高的网站,采用redis作为缓存有利于提高网站的并发性能以及访问速度。于是就采用了redis。

但是接着问题就来了,redis的存储对象有五种:字符串、列表、哈希表、集合和有序集合。这时候我需要存储一个struct数组的内容,然后就开始考虑这五种对象哪个适合存储我的内容,发现没有一个适合。幸好想到了一个好办法,就是采用JSON编码!将我的结构体数组先用JSON编码成字符串,存到redis中,然后读取的时候将字符串读取出来反编码成结构体数组。


redis的初始化:

func Init()(*Context, error){
myConn := new(Context)
c, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil{
fmt.Println(err)
return nil, err
}
myConn.context = c
return myConn,nil
}


编码写入redis中的代码:

func (conn *Context)InputImgPath(){
img1 := ImgPath{LittlePic:"static/images/me1.jpg",BigPic:"static/images/me1-1.jpg"}
img2 := ImgPath{LittlePic:"static/images/me2.jpg",BigPic:"static/images/me2-2.jpg"}
img3 := ImgPath{LittlePic:"static/images/me3.jpg",BigPic:"static/images/me3-3.jpg"}
img4 := ImgPath{LittlePic:"static/images/me4.jpg",BigPic:"static/images/me4-4.jpg"}
img5 := ImgPath{LittlePic:"static/images/me5.jpg",BigPic:"static/images/me5-5.jpg"}
img6 := ImgPath{LittlePic:"static/images/me6.jpg",BigPic:"static/images/me6-6.jpg"}
img7 := ImgPath{LittlePic:"static/images/me7.jpg",BigPic:"static/images/me7-7.jpg"}
img8 := ImgPath{LittlePic:"static/images/me8.jpg",BigPic:"static/images/me8-8.jpg"}
img9 := ImgPath{LittlePic:"static/images/me9.jpg",BigPic:"static/images/me9-9.jpg"}
img10 := ImgPath{LittlePic:"static/images/me10.jpg",BigPic:"static/images/me10-10.jpg"}
img11 := ImgPath{LittlePic:"static/images/me11.jpg",BigPic:"static/images/me11-11.jpg"}
img12 := ImgPath{LittlePic:"static/images/me12.jpg",BigPic:"static/images/me12-12.jpg"}
var ImgPathArray = [12]ImgPath{img1,img2,img3,img4,img5,img6,img7,img8,img9,img10,img11,img12}


result, err := json.Marshal(ImgPathArray)
if err != nil{
fmt.Println("Marshal error")
return
}


message, err := conn.context.Do("set","imgPath",result)
if err != nil{
fmt.Println("set imgPath error")
}
println(message)
}


从redis中读出来并反编码为结构体数组:

func (conn *Context)GetImgPath() interface{}{
var ImgPathArray []ImgPath
str, err := redis.String(conn.context.Do("get","imgPath"))
if err != nil{
fmt.Println("get imgPath error: ",err)
return nil
}

json.Unmarshal([]byte(str), &ImgPathArray)
//fmt.Println([]byte(str))
/*
for _, v := range ImgPathArray{
println(v.LittlePic)
println(v.BigPic)
}
*/
return ImgPathArray
}

0 0